使用Django Forms来显示和编辑?

时间:2009-12-15 12:07:04

标签: django django-forms

我正在努力解决如何在Django中最好地创建可以用于显示或编辑数据的HTML页面。也就是说,我希望字段的值在显示模式下显示为文本,但在编辑/添加模式时显示在它们的小部件中。似乎Django不是为此而设计的:字段总是出现在它们的小部件中(例如,文本输入,文本区域, 等)。

是否存在处理此问题的常用技巧,缺少使用表单而不使用其他表单?

我在想一个可以用于每个表单字段的自定义模板标签过滤器,例如:

{{form.field_name | render_field:mode}}

其中render_field将根据模式返回字段的HTML小部件,或仅返回文本值。

我错过了什么,或者这是一个可行的解决方案吗?

5 个答案:

答案 0 :(得分:4)

显然是在回答我自己的问题。我最终得到了一个由三部分组成的解决方案:

  1. 将模型附加到表单,因此我将为每个字段设置默认显示小部件
  2. 使用模板标记编写表单,并将表单传递给form.field,user和action
  3. 编写渲染模板标记以处理#2
  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在它们之间切换,激活和停用编辑模式。