基于10个Django类视图的只读视图

gue*_*tli 2 django readonly django-forms

我有10个基于Django类的视图,我想以只读方式显示给用户.

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

有MixIn还是其他简单的解决方案?

Ian*_*ice 5

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

  • disabled和的表单中的所有字段设置html属性readonly.

  • 覆盖form_validCBV 的方法,以便不会发生任何模型保存; 相反,渲染模板(就像没有提交数据一样).用户以这种方式提交表单时不会引起任何操作.

如果要在模板中呈现完整表单,则表单字段错误可能会显示在已禁用字段旁边; 通过删除表单的错误字典或单独渲染每个字段而不出错来解决这个问题.

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)
Run Code Online (Sandbox Code Playgroud)

将此概念扩展为非模型FormView非常简单; 从类FormMixin继承而来.:)