【问题标题】:ignore fields on update view忽略更新视图上的字段
【发布时间】:2022-01-10 17:32:07
【问题描述】:

我有一个非常大的表单,我有一个更新视图。问题是当用户提交更新时,它说某些字段是必需的,例如作者和发布日期。我不希望用户更改这些字段。字段是手动渲染的

如何在更新视图中忽略这些字段。

我已尝试将要求设置为 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,但这些字段不能为空

查看:

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__'

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    实现它的最简单方法是为编辑操作创建一个新表单,如下所示:

    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
    

    这是一个想法,尝试测试它,如果它给你一个错误,请在 cmets 中告诉我。

    【讨论】:

    • exclude 成功了,谢谢!
    【解决方案2】:

    您可以在模型类中设置 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 表示您不需要这些字段的表单中的任何值...

    【讨论】:

    • 仍然抛出他们需要的表单错误
    • 显示你的 models.py 文件或模型类
    • 尝试使用 exclude=['',''] 而不是 fields='all' 使用 null=True 和 blank=True sepcified
    【解决方案3】:

    这使得用户无法更改表单字段但仍会显示

    widgets = {
       'date_posted': forms.TextInput(attrs={'readonly':'readonly'}), }
    
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['date_posted'].required = False
    

    【讨论】:

      猜你喜欢
      • 2018-06-24
      • 2020-09-02
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 2015-10-13
      相关资源
      最近更新 更多