使用 CSV 上传测试 Django 表单

Testing a Django Form with a CSV upload

我有一个表单,用户可以将 CSV 文件上传到其中以进行数据处理。我目前正在尝试测试 form.is_valid() 方法。但是我正在关注 Django 文档,并且该表单仍然返回该字段需要一个值的错误。有什么想法吗?

文档

documentation 显示如下例子-

>>> c = Client()
>>> with open('wishlist.doc') as fp:
...     c.post('/customers/wishes/', {'name': 'fred', 'attachment': fp})

测试

class TestImportCSVForm(TestCase):

    def test_form_valid(self):
        with open('fake.csv', 'r', newline='') as csvfile:
            form_data = {
                'csv_file':  csvfile,
            }
            form = ImportCSVForm(data=form_data)
            self.assertTrue(form.is_valid())

形式

class ImportCSVForm(forms.Form):
    """ Form for uploading CSVs """
    csv_file = forms.FileField(
        label=_("CSV File"),
        help_text=_("Upload a CSV"))

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.layout = Layout(
            'csv_file',
            HTML("""<hr>"""),
            ButtonHolder(
                Submit('submit', 'Submit', css_class='btn btn-primary')
            )
        )

我运行测试时的错误

(Pdb) form.errors
{'csv_file': ['This field is required.']}

您需要将文件传递到带有文件 kwarg 的表单中。

class TestImportCSVForm(测试用例):

def test_form_valid(self):
    with File(file=tempfile.NamedTemporaryFile()) as csvfile:
        csvfile.write(b'test')
        csvfile.flush()
        form_data = {
            'csv_file':  csvfile,
        }
        form = ImportCSVForm(files=form_data)
        self.assertTrue(form.is_valid())