Mam ten formularz

class PostCreationForm(forms.ModelForm):
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

I próbuję przetestować go z tym testem

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()

Pasuje, ale wytwarza form.save() Django.db.utils.integrityError: wartość NULL w kolumnie "Autor_id" narusza ograniczenie nie-null

Próbowałem zmienić formę

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)

Ale nadal nie działa. Widziałem to jako polecany sposób przypisania pola do obiektu, jeśli nie chcę go zabrać jako wejście od użytkownika, jak w tym przypadku, gdzie chcę autora posta być obecnym użytkownikiem. Jak mam to naprawić, aby móc przetestować formularz?

0
Zarrie 14 październik 2020, 23:48

1 odpowiedź

Najlepsza odpowiedź

Podczas sprawdzania, czy formularz jest ważny, musisz wywołać metodę is_valid, nie jest to właściwość. Zmiana form.is_valid do form.is_valid() będzie działać.

form_valid() Nie zostanie jednak wywołany, gdy sprawdzasz form.is_valid(), więc prawdopodobnie chcesz użyć metod clean. Nieświadomy przykład:

class PostCreationForm(forms.ModelForm):

    def clean_author(self):
        author = self.cleaned_data.get('author')
        if not author:
            author = self.request.user
        return author
0
Glenn D.J. 15 październik 2020, 13:29