2009-12-15 34 views
6

我正在如何在Django中最好地创建HTML页面,可以用于显示或编辑数据。也就是说,我希望字段的值在显示模式下显示为文本,而在编辑/添加模式下则显示在他们的窗口小部件中。看起来,Django并没有设计成这样:字段总是出现在它们的小部件中(例如,文本输入,文本区域, 等)。使用Django Forms来显示和编辑?

是否有处理这种常见的技术,使用短的形式之一,而不是其他?

我在想,可用于任何形式的领域,如自定义templatetag过滤器:

{{form.field_name | render_field:模式}}

其中render_field要么返回字段的HTML小部件,或者仅仅是基于模式的文本值。

我错过了一些东西,或者这是一个可行的解决方案?

回答

3

回答我自己的问题,显然。我结束了三部分的解决方案:

  1. 附加模型的形式,所以我必须每场
  2. 使用模板标签写的形式默认的显示部件,其传递的形式点域,用户和行动
  3. 写渲染模板标签来处理#2

步骤一:

 
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 
0

由于要保存的数据,您必须连接到形式莫名其妙的模型,一个的ModelForm与否。因此,您可以直接使用该模型来获取值并将其呈现在您想要的模板中。

上述建议是可行的,但由于形式可以是相当复杂的,它可能不是一件容易的事还是值得的麻烦。取决于你想要这么做的频率。但是,这可能会更容易为模型而不是表单创建过滤器。

在主模板
+0

是的,我可以只使用模型,但是这并不采取任何形式可以做到优势。过滤器与此有什么关系?我有很多显示/编辑视图,所以一个好的选择可以让我们不必每次做两次(一次用于显示,一次用于编辑)。 – 2009-12-15 13:49:47

0

{% if form %} 
    {% include 'form.html' %} 
{% else %} 
    {% include 'display.html' %} 
{% endif %} 

那么这两个模板将只是呈现形式的一部分,或者一个漂亮的有组织的股利。 这样,编辑视图将会定义一个表单,而显示视图则不会。这将比你想要做的更容易跟踪(即使你正在尝试的应该是可能的,我相信你的方法会在性能上受到影响)。

我这样做在博客应用程序,以便编辑页面看起来就像页面的显示,因此使得它非常直观编辑/写博客条目。 (更何况这让我可以很轻松地把一些Ajax在编辑条目的任何视图中有一些不错的奇特的效果)

+0

这正是我不想做的。我不想有两种形式,只有一种。 – 2010-01-16 15:38:03

0

有我错过了什么

形式不仅显示领域的小部件,但也处理帖子数据。发送的帖子会导致它处理数据清理,表单和字段错误处理等。

这是一种打破模式 - 为什么创建和渲染表单对象只是为了调整它看起来不像表单?

如果你担心太多工作的模板,尝试用模板继承来解决它的最好的方式。如果你非常确定要只改变字段标签,就可以使某物像

{% if form %} 
    {% for error in form.field.errors %} 
     {{ error|escape }} 
    {% endfor %} 
    {{ form.field }} 
{% else %} 
    {{ object.field }} 
{% endif %} 

的各个领域,但IMO这不是问题的关键,情况因人而异。

还想到什么(你的解决方案的思维)是动态附加部件到表单域,但会被过度设计。

0

我有同样的问题。现在我有用于显示和编辑的单独模板;前者呈现对象字段,后者表示字段(但有时也包含对象字段,用于不可编辑的事物)。 HTML结构可能非常复杂:例如,在一些页面上,我有大型表格表示对象的多级分层结构。结果,我最终在两个模板中出现了大量重复的代码,这与DRY相反。

我在表单字段之前使用了模板过滤器,以便在与字段一起显示错误时保存代码。我认为这将是一个可行的解决方案。另一种可能性可能是使用ModelForm子类,它可以被告知呈现不可用的字段版本。这将有助于保持模板简单。您甚至可以渲染字段的静态和可编辑版本,并使用JavaScript在它们之间切换,激活和停用编辑模式。