是否有一种简单的方法可以将Django渲染为{{myform.name}}
John Smith
而不是
<input id="id_name" name="name" value="John Smith" />
在<form>
个标签内?或者我是以错误的方式解决这个问题?
答案 0 :(得分:21)
<form>
{% for field in form %}
{{ field.label }}: {{ field.value }}
{% endfor %}
</form>
答案 1 :(得分: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)
答案 2 :(得分:5)
另外,不要忘记你也可以{{myform.instance.name}}
答案 3 :(得分:3)
你也可以使用一个新的小部件:我这样做是为了让我可以创建一个创建日期文本显示的小部件,以及一个日期相同的隐藏表单,这样用户就可以看到,但他们无法改变它。
这是一个初始(仍在测试/待清理)版本:
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,)
。
答案 4 :(得分:2)
为什么不使用{{field.data}}?
答案 5 :(得分:2)
我认为这就是你想要的: http://code.djangoproject.com/ticket/10427
我修补了我的django并瞧瞧...
答案 6 :(得分:1)
这是上面@Matthew_Schinkel建议的方法,使用Django 2.2和python 3。
from django.utils.safestring import mark_safe
class PlainTextWidgetWithHiddenCopy(forms.Widget):
def render(self, name, value, attrs, renderer=None):
if hasattr(self, 'initial'):
value = self.initial
return mark_safe(
(str(value) if value is not None else '-') +
f"<input type='hidden' name='{name}' value='{value}'>"
)
这是一个自定义窗口小部件,将字段内容呈现为纯文本,后跟一个html标签,该标签创建一个隐藏字段,其名称和值与原始字段相同。
这意味着,除了显示给用户的值之外,它还被浏览器保留并继续发送到处理提交表单的视图。
如果表单过帐,这将特别方便,因为否则未设置字段的initial
值,明文数据将消失。
例如,如果您的表单包含:
my_field = forms.IntegerField(
widget=PlainTextWidgetWithHiddenCopy,
initial=12345)
然后该字段将显示为以下html:
12345<input type='hidden' name='my_field' value='12345'>
提交表单后,相应视图接收的POST数据将包括:
{'my_field': '12345'}
这意味着如果视图现在重新呈现表单,则my_field
的值将再次设置为12345
,就像请求是GET
一样。
正如Matthew在随后的评论中正确指出的那样,这种方法无法有效防止用户更改在隐藏字段中发回的数据。 “所有用户输入都是邪恶的。”