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

Readonly View for 10 Django Class Based Views

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

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

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

这是一个可以做两件简单事情的 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 非常简单;改为从 class FormMixin 继承。 :)

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

class DisallowPostMixin(object):

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

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

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