Django单元测试表单,带有从请求对象分配的字段

Django单元测试表单,带有从请求对象分配的字段,django,django-testing,django-tests,Django,Django Testing,Django Tests,我有这张表格 class PostCreationForm(forms.ModelForm): def form_valid(self, form): form.instance.author = self.request.user return super().form_valid(form) 我试着用这个测试对它进行单元测试 class PostCreationByFormTestCase(TestCase): def __init__(se

我有这张表格

class PostCreationForm(forms.ModelForm):
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)
我试着用这个测试对它进行单元测试

class PostCreationByFormTestCase(TestCase):
    def __init__(self, *args, **kwargs):
        super(PostCreationByFormTestCase, self).__init__(*args, **kwargs)
        self.CustomUser = get_user_model()

    def setUp(self):
        self.credentials = {
            'username': 'john_smith',
            'password': 'St0ngPassw0rd'
        }
        self.user = self.CustomUser.objects.create(
            username=self.credentials['username'],
            email='john_smith@mail.com',
            password=self.credentials['password'],
            first_name='John',
            last_name='Smith'
        )

    def test_simple_form(self):
        form_data = {
            'author': self.user,
            'title': 'Simple Post',
            'description': 'very good description',
        }
        form = PostCreationForm(form_data)
        self.assertTrue(form.is_valid)
        post = form.save()
断言通过,但
form.save()
生成 django.db.utils.IntegrityError:列“author_id”中的null值违反了not null约束

我试着把表格改成

class PostCreationForm(forms.ModelForm):
    def form_valid(self, form):
        if not form.instance.author:
            form.instance.author = self.request.user
        return super().form_valid(form)
但它仍然不起作用。如果我不想将字段作为用户的输入,我认为这是一种将字段分配给对象的推荐方法,在这种情况下,我希望文章的作者是当前用户。
为了能够测试表单,我应该如何解决这个问题?

当检查表单是否有效时,需要调用方法
是否有效
,它不是一个属性。将
form.is\u valid
更改为
form.is\u valid()

form\u valid()。一个未经测试的例子:

class PostCreationForm(forms.ModelForm):

    def clean_author(self):
        author = self.cleaned_data.get('author')
        if not author:
            author = self.request.user
        return author

谢谢Glenn注意到这个错误!不幸的是,即使我修复了它,断言仍然通过,但是
form.save()
会产生集成错误哦,是的,你应该使用
clean()
方法,而不是
form\u valid
。我会更新我的答案。好的,我想我不明白问题是什么。我希望在后期创建时自动分配
author
字段,因此我在模型中设置了字段
editable=False
,然后使用
请求将其分配到视图中。user
,但现在我认为这使得表单很难测试,不是吗?我也认为最好在视图中指定作者,但我已使用
clean
更新了我的答案。(注意,我没有测试这段代码。)关于测试,我没有发现任何问题?我真的很喜欢这个解决方案,并且考虑过类似的事情,但是它真的有意义吗?在测试表单的单元测试中,我没有请求对象,表单是在任何视图之外使用的,那么
self.request
意味着什么呢?