在Django表单中将值呈现为文本而不是字段

时间:2009-07-15 21:05:11

标签: django django-templates django-forms

是否有一种简单的方法可以将Django渲染为{{myform.name}}

John Smith

而不是

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

<form>个标签内?或者我是以错误的方式解决这个问题?

7 个答案:

答案 0 :(得分:21)

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

点击此处Form fieldsWorking with forms

答案 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在随后的评论中正确指出的那样,这种方法无法有效防止用户更改在隐藏字段中发回的数据。 “所有用户输入都是邪恶的。”