Игнорирование полей в представлении обновления
У меня есть очень большая форма, для которой есть представление обновления. Проблема в том, что когда пользователь отправляет обновление, он говорит, что некоторые поля являются обязательными, такие как автор и дата публикации. Я не хочу, чтобы пользователи изменяли эти поля. Поля отображаются вручную
Как я могу игнорировать эти поля в представлении обновления.
Я пытался установить требования на 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
Это идея, попробуйте протестировать ее, и если она даст вам ошибку, дайте мне знать в комментариях.