【问题标题】:Readonly View for 10 Django Class Based Views10 个基于 Django 类的视图的只读视图
【发布时间】:2016-08-23 17:09:01
【问题描述】:

我有 10 个基于 Django 类的视图,我想以只读方式向用户显示它们。

我希望整个表单是只读的,而不仅仅是某些值。应在客户端 (HTML) 上禁用提交表单,并在服务器上禁用第二次(不允许 POST)。

是否有 MixIn 或其他简单解决方案?

【问题讨论】:

  • 这可能听起来很傻,但如果表单不可编辑,那么为什么要将它们呈现为表单呢?为什么不只渲染常规的不可编辑的 HTML?
  • @solarissmoke 我想避免两次做同样的事情。我想渲染数据。我不在乎它是呈现为形式还是以不同的方式呈现。表单的布局已经完成。这就是为什么我想重用它。我关心目标,我想采取最简单的策略来实现目标:-)

标签: django django-forms readonly


【解决方案1】:

这是一个做两件简单事情的mixin:

  • disabledreadonly的表单中的所有字段设置html属性。

  • 覆盖 CBV 的 form_valid 方法,因此不会发生模型保存;而是呈现模板(就像没有提交数据一样)。这样,用户在提交表单时不会执行任何操作。

如果您在模板中呈现完整的表单,表单字段错误可能会出现在禁用字段旁边;通过删除表单的错误字典或单独呈现每个字段而不会出现错误来解决此问题。

from django.views.generic.edit import FormMixin, ModelFormMixin

class ReadOnlyModelFormMixin(ModelFormMixin):

    def get_form(self, form_class=None):

        form = super(ReadOnlyModelFormMixin, self).get_form()

        for field in form.fields:
            # Set html attributes as needed for all fields
            form.fields[field].widget.attrs['readonly'] = 'readonly'          
            form.fields[field].widget.attrs['disabled'] = 'disabled'

        return form

    def form_valid(self, form): 
        """
        Called when form is submitted and form.is_valid()
        """
        return self.form_invalid(form)

为非模型 FormView 扩展这个概念非常简单;而是从类 FormMixin 继承。 :)

【讨论】:

  • 这适用于所有类型的 Django 字段和小部件吗?
  • 'readonly' 和 'disabled' 属性是客户端可以覆盖的 html 属性,但会阻止元素上的输入事件(如 here 所示)。 form_valid 方法是每当对 CBV 中定义的表单/模型表单进行 GET 或 POST 时发生的操作。通过在表单实际有效时返回 form_invalid 方法,不会执行任何“有效提交”操作,从而使用户无法通过提交任何表单进行更改。所以,总而言之,是的:)
【解决方案2】:

要一般禁止 POST 请求基于类的视图,您可以使用以下 mixin:

class DisallowPostMixin(object):

    def post(self, request, *args, **kwargs):
        return self.http_method_not_allowed(self, request, *args, **kwargs)

如果您还想禁用某些表单字段等,您可以从 Ian Price 的回答中添加 get_form 方法。

【讨论】:

    【解决方案3】:

    您可以通过中间件破解它。在请求时 - 检查视图名称和请求方法(如果是后重定向),在响应时 - 在 response.content 中添加输入属性。但是 mixin - 最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2017-01-22
      • 2018-05-14
      • 2014-02-21
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多