Python 带有modelchoicefield的Django测试表

Python 带有modelchoicefield的Django测试表,python,django,testing,Python,Django,Testing,我修改了一个表单,创建了一个ModelChoiceField,这样用户只能选择他们设置的类别。当我在浏览器中运行我的应用程序时,这可以正常工作,但测试失败(因为它说表单无效),如果删除ModelChoiceField并允许它显示模型中的所有类别,则测试通过 我很高兴表单的代码在浏览器中按预期和要求工作;这是我想要修复的测试用例。我想有一些明显的东西我看不见,因为我已经看了太多次了 从测试用例中提取 def setUp(self): user = User.objects.create(u

我修改了一个表单,创建了一个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)

您需要将
user
作为kwarg传递:

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

添加一些打印/日志记录以找出问题所在。检查
form.errors
self.user
self.fields['category']的值。queryset
。它可能会给你一个错误的提示,就是这样!非常感谢。