Настройка пользователя модели на request.user с CreateView в Django возвращает ошибку «нулевое значение в столбце« author_id »» - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть CreateView, работающий с ModelForm, который подклассов моделирует Item.Item.author = ForeignKey (User, on_delete = models.CASCADE,)

В CreateView пользователь заполняет большую часть формы, но я хочу, чтобы Item.author был установлен для request.user.Всякий раз, когда я делаю это, используя form_valid () для установки form.instance.author = self.request.user, я получаю сообщение об ошибке, говоря, что «нулевое значение в столбце« author_id »нарушает ненулевое ограничение»

Я попытался удалить «автора» как поле для редактирования из form.py.

Это то, что я пытаюсь повторить: https://docs.djangoproject.com/en/2.1/topics/class-based-views/generic-editing/#models-and-request-user

Model.py


    class Item(models.Model):


    # SOME OTHER FIELDS WHICH RENDER AND SAVE FINE

    author = models.ForeignKey(User,
                                on_delete=models.CASCADE,

            def get_absolute_url(self):
               return reverse('item_detail',args=[str(self.id)])
                               )

forms.py

    class SubmitItemForm(forms.ModelForm):

    class Meta():
        model = Item
        fields = ('link','title','excerpt','type','author')


    def __init__(self, *args, **kwargs):
        super(SubmitItemForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.form_id = 'submit_item'
        self.helper.form_class = 'submit'
        self.helper.form_method = 'post'
        self.helper.form_action = 'item_detail'

        self.helper.add_input(Submit('submit', 'Submit'))

views.py

    class SubmitItem(LoginRequiredMixin, generic.CreateView):
    login_url = '/login/'
    redirect_field_name = 'item_detail.html'
    form_class = SubmitItemForm
    model = Item

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

    def form_invalid(self, form):
        response = super().form_invalid(form)
        return response

Я ожидаю сохранения формы в базе данных и перенаправления браузера на сохраненные данные с помощьюМетод get_absolute_url (), описанный в модели Item.

Ответы [ 2 ]

0 голосов
/ 07 апреля 2019

Для тех, кто борется с этой же проблемой - вот как я заставил ее работать.Я не включил в код выше (!!!), что у меня есть метод def clean (self) в модели.

'' 'python def clean (self): all_clean_data = super ().clean () self.save ()

Я удалил эту строку (как я полагаю, это было из предыдущей итерации, а form_valid () позаботился о проверке (?) и применил исправление Anjaneyulu выше, а теперь и модельсохраняет правильно.

0 голосов
/ 07 апреля 2019

Вы можете изменить свой form_valid метод, как показано ниже

    def form_valid(self, form):
        form.instance.author_id = self.request.user.pk
        return super().form_valid(form)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...