忽略更新视图中的字段
ignore fields on update view
我有一个非常大的表单,我有一个更新视图。问题是当用户提交更新时,它说某些字段是必需的,例如作者和 post 日期。我不希望用户更改这些字段。字段是手动渲染的
如何在更新视图中忽略这些字段。
我试过将要求设置为 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
很多 post 说要添加 null=True
但这些字段不能为 null
查看:
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__'
您可以在模型 class 中设置 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
这就是想法,尝试对其进行测试,如果它给您带来错误,请在评论中告诉我。
我有一个非常大的表单,我有一个更新视图。问题是当用户提交更新时,它说某些字段是必需的,例如作者和 post 日期。我不希望用户更改这些字段。字段是手动渲染的
如何在更新视图中忽略这些字段。
我试过将要求设置为 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
很多 post 说要添加 null=True
但这些字段不能为 null
查看:
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__'
您可以在模型 class 中设置 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
这就是想法,尝试对其进行测试,如果它给您带来错误,请在评论中告诉我。