我有10个基于Django类的视图,我想以只读方式显示给用户。
我希望整个表单都是只读的,而不仅仅是一些值。提交表单应该在客户端(HTML)上禁用,第二次在服务器上禁用(不允许POST)。
是否有MixIn或其他简单解决方案?
答案 0 :(得分:5)
这是一个做两件简单事情的混合物:
为disabled
和readonly
的表单中的所有字段设置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继承而来。 :)
答案 1 :(得分:1)
要暂停基于类的视图的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
方法。
答案 2 :(得分:0)
你可以通过中间件破解它。根据请求 - 检查视图名称和请求方法(如果是重定向),响应时 - 在response.content中添加输入attrs。但是mixin - 最好的解决方案。