2009-07-15 97 views
15

内的值作为文本而不是域有一个简单的方法,使Django的渲染{{myform.name}}作为渲染Django表单

John Smith 

,而不是

<input id="id_name" name="name" value="John Smith" /> 

<form>标签?或者我正在以这种错误的方式去做?

回答

21
<form> 
    {% for field in form %} 
      {{ field.label }}: {{ field.value }} 
    {% endfor %} 
</form> 

采取这里看看Form fieldsWorking with forms

+0

谢谢 - 我见过.label但不.initial。奇怪的是,在“使用表单”文档中甚至没有提到.initial。 – ine 2009-07-15 21:25:59

+0

。初始只在表单第一次出现时正常工作,对吗?例如,如果出现错误并且您重新提交表单,我的经验将不会有初始记录。 – dfrankow 2009-08-21 04:01:33

+0

在Django术语中,这只适用于未绑定的表单。如果您希望它能够同时使用未绑定和已绑定的表单,该怎么办? – dfrankow 2009-08-21 15:44:12

3

你也可以使用一个新的widget:我这样做,这样我可以有创建日期的文本显示窗口小部件,以及一个隐藏的形式它的日期相同,所以用户可以看到它,但是它们不能改变它。

这里是一个初始(仍在测试/被清理)版本:

class DayLabelWidget(forms.Widget): 
    def render(self, name, value, attrs): 
     final_attrs = self.build_attrs(attrs, name=name) 
     if hasattr(self, 'initial'): 
      value = self.initial 
     if type(value) == type(u''): 
      value = datetime.date(*map(int, value.split('-'))) 
     return mark_safe(
      "%s" % value.strftime("%A (%d %b %Y)") 
     ) + mark_safe(
      "<input type='hidden' name='%s' value='%s' />" % (
       name, value 
      ) 
     ) 

    def _has_changed(self, initial, data): 
     return False 

然后你在场上以此为(widget=DayLabelWidget,)

5

而且,不要忘记,你还可以做{{myform.instance.name}}

2

为什么不使用{{field.data}}?

11

老话题,但我认为有些人还来这里。

你可以做这样的事情太:

from django.utils.safestring import mark_safe 

class PlainTextWidget(forms.Widget): 
    def render(self, _name, value, _attrs): 
     return mark_safe(value) if value is not None else '-' 

而且在你的表格

class SomeForm(Form): 
    somename = forms.CharField(widget=PlainTextWidget)