【问题标题】:Testing a Django Form with a CSV upload使用 CSV 上传测试 Django 表单
【发布时间】:2019-10-20 05:31:18
【问题描述】:

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

【问题讨论】:

    标签: django django-forms django-testing


    【解决方案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())
    

    【讨论】:

    • 我认为你是对的,但它仍然是错误的 - {'csv_file': ['No file was submitted. Check the encoding type on the form.']}。在手动测试表单时,表单没有任何问题。想法?
    • 嗯,很有趣。我尝试的时候也一样。我检查了我过去的表单测试,包括文件,这就是我使用临时文件而不是打开实际文件来处理它们的方式。也许我遇到了同样的问题,因为我只是在检查有效性,这作为一个单元测试工作得很好。抱歉格式化,无法在评论中找出代码块。 with File(file=tempfile.NamedTemporaryFile()) as f: f.write(b'test') f.flush() form = DocumentationForm(data={'title': 'Test'}, files={'document_file': f}) self.assertTrue(form.is_valid())
    • 解决了。如果你改变你的答案,我会接受。谢谢!
    猜你喜欢
    • 2020-11-04
    • 2023-04-06
    • 1970-01-01
    • 2013-03-18
    • 2020-03-04
    • 2021-10-05
    • 1970-01-01
    • 2020-03-12
    • 2013-11-30
    相关资源
    最近更新 更多