【问题标题】:How to make a Django Model form Readonly?如何使 Django 模型表单只读?
【发布时间】:2015-11-21 18:55:40
【问题描述】:

我有一个 django 表单名称“SampleForm”。我用它来接受用户的输入。现在我想使用相同的表单在不同的页面上向用户显示此信息。但是表单是可编辑的我想让表单只读。有没有办法让整个表单只读?

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    伪代码(未测试):

    class ReadOnlyFormMixin(ModelForm):
        def __init__(self, *args, **kwargs):
            super(ReadOnlyFormMixin, self).__init__(*args, **kwargs)
            for key in self.fields.keys():
                self.fields[key].widget.attrs['readonly'] = True
    
        def save(self, *args, **kwargs):
            # do not do anything
            pass
    
    class SampleReadOnlyForm(ReadOnlyFormMixin, SampleForm):
        pass
    

    【讨论】:

    • 这是一个很好的答案,因为使用相同的 frm 来编辑信息。
    • 如果你使用的是Django>=1.9,你可以使用self.fields[key].disabled = True docs.djangoproject.com/en/1.9/ref/forms/fields/#disabled
    • @JoeJ 评论的旁注。如果在某些情况下,您只想锁定表单的一部分——如果它们是disabled,则这些字段将不会出现在表单数据中。 (即,如果有人希望发布字段数据,则将其设为readonly 仍然是一种选择)。
    • 有了这个,任何人都可以在浏览器中编辑该字段并发布它。如果有人在浏览器中编辑 HTML 并提交表单,知道如何在后端进行限制吗?
    【解决方案2】:
    class SampleForm(ModelForm):
        def __init__(self, *args, **kwargs):
            super(SampleForm, self).__init__(*args, **kwargs)
            instance = getattr(self, 'instance', None)
            if instance and instance.pk:
                for field in self.fields.keys():
                    self.fields[field].widget.attrs['readonly'] = True
    

    只要有实例可用于表单,这应该使整个表单只读。

    【讨论】:

    • 这不会阻止 POST 黑客攻击,所以要小心。
    【解决方案3】:

    工作代码

    class ReadOnlySampleForm(SampleForm):
    def __init__(self, *args, **kwargs):
        super(SampleForm, self).__init__(*args, **kwargs)
        for key in self.fields.keys():
            self.fields[key].widget.attrs['readonly'] = True
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 2012-09-18
      • 2015-08-19
      • 2013-12-16
      • 2011-05-19
      • 1970-01-01
      • 2014-02-28
      • 2019-11-13
      相关资源
      最近更新 更多