【问题标题】:how to test forms in django?如何在 Django 中测试表单?
【发布时间】:2015-11-12 02:10:28
【问题描述】:

我的模型如下所示:

class Car(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    name = models.CharField(max_length=200)

class Owner(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    car = models.ForeignKey(Car)

还有一个看起来像这样的表格

class CarForm (forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(CarForm, self).__init__(*args, **kwargs)
        self.fields['car_name']=forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}),label='', required=False)
        self.fields['person_name']=forms.CharField(widget=forms.TextInput(attrs={'autocomplete':'off'}),label='', required=False)

因此,当用户访问我的索引文件时,他会找到两种形式,一种是他的姓名,另一种是汽车的名称,提交时将在数据库中创建。

所以现在我在 shell 中并想测试它,但我不确定正确的 sytnax 是什么,我尝试了这个:

response = client.post('/', {'car_name':'something','person_name':'something'})

但我总是得到一个

IndexError: 列表索引超出范围

这是什么意思?或者运行测试的正确语法是什么?

我也试过了

response = client.post('/', {'id_car_name':'something','id_first_name':'something'})

因为这些是 django 在主页中创建的 id,但没有工作

【问题讨论】:

    标签: django forms testing


    【解决方案1】:

    您的测试用例语法看起来是正确的。第一个示例中的字段名称是正确的,并且与self.fields 中声明的字段名称相匹配。这是一个更详细的示例(根据需要使用断言):

    from django.test import Client, TestCase
    
    class CarFormTest(TestCase):
        def test_form(self):
            client = Client()
            response = client.post('/', {'car_name':'something','person_name':'something'})
            self.assertEqual(response.status_code, 200)
    

    我在您的测试行中没有看到任何会导致 IndexError 的内容。

    鉴于您没有像这样将 Car 模型映射到 CarForm:

    class CarForm(forms.modelForm):
        class Meta:
            model = Car
    

    您似乎不需要直接映射,而是需要在 CarForm 上使用自定义 save() 方法来在保存表单时创建 CarOwner 对象。 IndexError 必须来自您未显示的代码行。

    请更新您的问题以提供更多代码。

    【讨论】:

    • 是的,你是对的,我错过了另一个需要的表单输入。这就是它失败的原因。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2015-10-23
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2018-02-09
    • 2019-11-13
    • 2015-11-06
    相关资源
    最近更新 更多