Как установить значение поля 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
    })
Вернуться на верх