По-прежнему получаем ошибку валидации, несмотря на использование 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
})