Игнорирование полей в представлении обновления

У меня есть очень большая форма, для которой есть представление обновления. Проблема в том, что когда пользователь отправляет обновление, он говорит, что некоторые поля являются обязательными, такие как автор и дата публикации. Я не хочу, чтобы пользователи изменяли эти поля. Поля отображаются вручную

Как я могу игнорировать эти поля в представлении обновления.

Я пытался установить требования на false

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['author'].required = False
    self.fields['date_posted'].required = False

Но это бросает null value in column "author" of relation "blog_post" violates not-null constraint

Во многих сообщениях говорится о необходимости добавить null=True, но эти поля не могут быть null

view:

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    form_class = PostFormUpdate
   
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user.id == post.author_id:
            return True
        return False

Форма:

class PostFormUpdate(ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

вы можете установить blank=True либо в классе модели, который будет реализован на всех http методах, либо используя вышеуказанную технику, которую вы использовали

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['author'].blank = True
    self.fields['date_posted'].blank = True

blank=True означает, что вы не требуете от форм никаких значений для этих полей...

Это делает так, что пользователь не может изменить поле формы, но оно все равно отображается

widgets = {
   'date_posted': forms.TextInput(attrs={'readonly':'readonly'}), }


def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['date_posted'].required = False

Самый простой способ достичь этого - просто создать новую форму для действия редактирования следующим образом:

class PostFormUpdate2(ModelForm):
    class Meta:
        model = Post
        exclude = ('author','date_posted')

Тогда у вас не будет этих данных в следующей форме:

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    form_class = PostFormUpdate2
   
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user.id == post.author_id:
            return True
        return False

Это идея, попробуйте протестировать ее, и если она даст вам ошибку, дайте мне знать в комментариях.

Вернуться на верх