我正在努力解决如何在Django中最好地创建可以用于显示或编辑数据的HTML页面。也就是说,我希望字段的值在显示模式下显示为文本,但在编辑/添加模式时显示在它们的小部件中。似乎Django不是为此而设计的:字段总是出现在它们的小部件中(例如,文本输入,文本区域, 等)。
是否存在处理此问题的常用技巧,缺少使用表单而不使用其他表单?
我在想一个可以用于每个表单字段的自定义模板标签过滤器,例如:
{{form.field_name | render_field:mode}}
其中render_field将根据模式返回字段的HTML小部件,或仅返回文本值。
我错过了什么,或者这是一个可行的解决方案吗?
答案 0 :(得分:4)
显然是在回答我自己的问题。我最终得到了一个由三部分组成的解决方案:
第一步:
form.model = Model(...)
第二步:
{{form.field1.label}} {% render form.field1 user action %} {{form.field2.label}} {% render form.field2 user action %}
第三步:
类似的东西:
def render(formfield, user, action, default_text="Private"): if not user.is_authenticated(): action = "view" if action == "view": if user.is_authenticated(): fieldname = formfield.name retval = str(getattr(formfield.form.model, fieldname)) else: retval = default_text else: retval = formfield.as_widget() return retval
答案 1 :(得分:0)
由于您要保存数据,因此您必须以某种方式将模型附加到表单,否则是模型。因此,您可以直接使用该模型获取值并将其呈现在模板中,如您所愿。
上述建议是可行的,但由于形式可能相当复杂,因此这可能不是一件容易的事情,也不值得烦恼。取决于你想要这样做的频率。但是,为模型而不是表单创建过滤器可能会更容易。
答案 2 :(得分:0)
在主模板中
{% if form %}
{% include 'form.html' %}
{% else %}
{% include 'display.html' %}
{% endif %}
然后这两个模板只是呈现表单的部分,或者是一个很好的有组织的div。 这样,编辑视图将定义一个表单,而显示视图则不会。这比你想要做的更容易跟踪(即使你正在尝试的应该是可能的,我相信你的方法会受到影响)。
我在博客应用程序中执行此操作,以便编辑页面看起来就像显示页面,因此编辑/编写博客条目非常直观。 (更不用说这允许我非常轻松地将一些ajax用于编辑任何视图中的条目并具有一些不错的花哨效果)
答案 3 :(得分:0)
我错过了什么
表单不仅显示字段小部件,还处理发布数据。发送的帖子会导致它处理数据清理,表单和字段错误处理等。
这有点打破了模式 - 为什么创建和渲染表单对象只是为了调整它看起来不像表单?
如果您担心模板上的工作太多,请尝试以最佳方式使用模板继承来解决它。如果您确定只想更改字段标记,则可以使用
{% if form %}
{% for error in form.field.errors %}
{{ error|escape }}
{% endfor %}
{{ form.field }}
{% else %}
{{ object.field }}
{% endif %}
对于每个领域,但IMO不是重点,YMMV。
另外我想到的是(考虑到你的解决方案)是动态地将小部件附加到表单字段,但那是过度工程。
答案 4 :(得分:0)
我有同样的问题。现在我有单独的模板用于显示和编辑;前者呈现对象字段,后者形成字段(但有时也是对象字段,用于不可编辑的事物)。 HTML结构可能非常复杂:例如,在某些页面上,我有大表,表示对象的多级层次结构。结果,我最终在两个模板中有大量重复的代码,这与DRY相反。
我之前使用过表单字段的模板过滤器,以便在与字段一起显示错误时保存代码。我认为在这种情况下这将是一个可行的解决方案。另一种可能是使用ModelForm子类,可以告诉它渲染字段的不可编辑版本。这有助于保持模板简单。您甚至可以渲染字段的静态版本和可编辑版本,并使用JavaScript在它们之间切换,激活和停用编辑模式。