Не удается назначить поле в методе form_valid - PullRequest
2 голосов
/ 06 марта 2020

Я получаю сообщение об ошибке:

Ошибка IntegrityError в / projects / 1 / Issues / New / NOT NULL Не удалось выполнить ограничение: questions_issue.project_id Метод запроса: URL-адрес запроса POST: http://127.0.0.1: 8000 / projects / 1 / Issues / New / Django Версия: 3.0.3 Тип исключения: IntegrityError Значение исключения:
Сбой ограничения NOT NULL: questions_issue.project_id

Проблемы имеют внешний ключ для проекта, и я назначаю его в методе form_valid, я делаю то же самое с пользователем, и это прекрасно работает

CreateView в views.py:

class IssueCreateView(LoginRequiredMixin, CreateView):
        model = Issue
        fields = ['title', 'details', 'priority', 'status', 'estimated_work_hours', 'loaded_work_hours']

        def form_valid(self, form):
            form.instance.project = get_object_or_404(Project, pk=self.kwargs['project_id'])
            print(form.instance.project)
            form.instance.creator = self.request.user
            return super().form_valid(form)

строка print(form.instance.project) печатает правильный проект, поэтому он работает.

models.py:

class Issue(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    creator = models.ForeignKey(User, related_name="%(class)ss_created", on_delete=models.CASCADE)
    ...
    ...

Почему я могу назначить поле создателя пользователю в методе form_valid, но когда я это делаю то же самое для поля Project это не работает, я не понимаю.

Кто-нибудь знает, в чем может быть проблема?

Спасибо

1 Ответ

0 голосов
/ 07 марта 2020

Ваша форма не учитывает project и creator в вашем случае. Это почти то же самое, если бы вы просто установили form.instance.xyz = self.request.user

Таким образом, вы должны добавить project и creator к своим полям.

Если вы используете {{ form.as_p }}, у вас возникнет следующая проблема - эти поля будут включены в вашу форму. Есть несколько способов справиться с этим. Можно было бы просто скрыть их в пользовательской форме. Окончательный результат будет:

from django import forms

class IssueForm(forms.ModelForm):
    class Meta:
        model = Issue
        fields = ['project', 'creator', 'title', 'details', 'priority', 'status', 'estimated_work_hours', 'loaded_work_hours']
        widgets = {
            'project': forms.HiddenInput(),
            'creator': forms.HiddenInput(),
        }

class IssueCreateView(LoginRequiredMixin, CreateView):
    model = Issue
    form_class = IssueForm

    def form_valid(self, form):
        form.instance.project = get_object_or_404(Project, pk=self.kwargs['project_id'])
        form.instance.creator = self.request.user
        return super().form_valid(form)
...