忽略更新视图中的字段

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

这就是想法,尝试对其进行测试,如果它给您带来错误,请在评论中告诉我。