По-прежнему получаем ошибку валидации, несмотря на использование save(commit=False)

Модельная форма:

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = ['title', 'slug', 'category', 'description', 'thumbnail', 'status', 'author']

view:

if request.method == 'POST':
        form = ArticleForm(request.POST, request.FILES)

        if not request.user.is_superuser:
            art = form.save(commit=False)    # Error line
            art.author = request.user
            art.status = 'd'
            art.save()
            return HttpResponseRedirect(reverse('account:home'))
        elif form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('account:home'))
        
        return render(request, 'registration/add-update-article.html', {
            'form': form
        })

Если пользователь не является суперпользователем, он не может заполнить некоторые поля формы, поэтому я хочу установить их значения в этом представлении. Разве commit=False не должен предотвращать появление ошибок валидации? Почему я все равно получаю ошибку?

Когда вы устанавливаете опцию commit в значение False, save() создает объект Model, но не сохраняет его в базе данных. Он по-прежнему выполняет валидацию; см. https://docs.djangoproject.com/en/4.1/topics/forms/modelforms/#the-save-method. Не стоит пытаться подавить валидацию. Вместо этого выясните, что не так с формой, и установите атрибуты так, чтобы они не были обязательными, имели другое максимальное значение и т.д.

Однако, если вы хотите изменить поля формы перед сохранением, вы можете сделать следующее:

if request.method == 'POST':
        form = ArticleForm(request.POST, request.FILES)

        if not request.user.is_superuser:
            Article.create(**form.cleaned_data, author=request.user, status="d")
            return HttpResponseRedirect(reverse('account:home'))
        elif form.is_valid():
            form.save()
            return HttpResponseRedirect(reverse('account:home'))
        
        return render(request, 'registration/add-update-article.html', {
            'form': form
        })
Вернуться на верх