Как установить значение поля readonly (disabled) формы модели в его инициализированное значение при публикации формы?
Я создаю форму для авторов статей. Форма содержит поле author
и поле status
. Я хочу, чтобы эти два поля могли быть изменены только в том случае, если пользователь является суперпользователем. Если он не является суперпользователем, то его имя пользователя инициализируется как author
, а черновик как status
. Мне удалось это сделать, но когда я отправляю форму, она считается недействительной и возвращает страницу формы с ошибками, в которых говорится, что поля status и author являются обязательными и они также больше не отключены! Игнорирует ли Django значения полей только для чтения в этом случае или... ? Как я могу это исправить?
Модельная форма:
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'slug', 'category', 'description', 'thumbnail', 'status', 'author']
view:
def add_update_article(request):
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('account:home'))
return render(request, 'registration/add-update-article.html', {
'form': form
})
else:
if not (request.user.is_author or request.user.is_superuser):
raise Http404
form = ArticleForm(initial={'author': request.user, 'status': 'd'})
if not request.user.is_superuser:
form.fields['author'].disabled = True
form.fields['status'].disabled = True
return render(request, 'registration/add-update-article.html', {
'form': form
})
Используйте commit=False
в разделе просмотра вашего сообщения.
if form.is_valid():
obj = form.save(commit=False)
obj.author = request.user
obj.status = 'd'
obj.save()
Передайте начальные значения в ArticleForm после POST-запроса. Они больше не отключены, потому что вы находитесь в другой ветви оператора if.
def add_update_article(request):
if not (request.user.is_author or request.user.is_superuser):
raise Http404
initial_fields = {'author': request.user, 'status': 'd'}
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES, initial=initial_fields)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('account:home'))
else:
form = ArticleForm(initial=initial_fields )
if not request.user.is_superuser:
form.fields['author'].disabled = True
form.fields['status'].disabled = True
return render(request, 'registration/add-update-article.html', {
'form': form
})