Django测试表与modelchoicefield

时间:2017-12-08 14:47:59

标签: python django testing

我修改了一个表单以创建一个ModelChoiceField,以便用户只能选择他们已设置的类别。当我在浏览器中运行我的应用程序但未通过测试(因为它表示表单无效)时,这正常工作,如果您删除ModelChoiceField并允许它显示模型中的所有类别,则会通过。

我很高兴表单的代码在浏览器中按预期和要求运行;这是我想修复的测试用例。我想有一些我看不见的东西,因为我已经看过很多次了。

从测试用例中提取

def setUp(self):
    user = User.objects.create(username='user', password='')
    self.category = Category.objects.create(id=1, user=user, title='category1')
    self.myitem = MyModel.objects.create(id=1, user=user, title='title1', amount=10, category=self.category)

def test_form_validation_with_valid_data(self):
    user = User.objects.get(username='user')
    now = timezone.now()
    form = MyModelForm({'title': 'title1', 'category': 1,  'amount': 100, 'date': now,}, user)
    self.assertTrue(form.is_valid())

从forms.py中提取

class MyModelForm(forms.ModelForm):

    class Meta:
        model = MyModel
        fields = ('title', 'category', 'amount', 'date',)

    category = forms.ModelChoiceField(queryset=None)

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['category'].queryset = Category.objects.filter(user=self.user)

1 个答案:

答案 0 :(得分:1)

您需要将user作为kwarg传递:

form = MyModelForm({'title': 'title1', 'category': 1,  'amount': 100, 'date': now,}, user=user)