使用CSV上传测试Django表单

时间:2019-06-04 16:38:05

标签: django django-forms django-testing

我有一个表单,用户可以将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.']}

1 个答案:

答案 0 :(得分:1)

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

TestImportCSVForm(TestCase)类:

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())