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

ine*_*ine 16 django django-templates django-forms

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

John Smith
Run Code Online (Sandbox Code Playgroud)

代替

<input id="id_name" name="name" value="John Smith" />
Run Code Online (Sandbox Code Playgroud)

里面的<form>标签?或者我是以错误的方式来做这件事的?

tef*_*ozi 22

<form>
    {% for field in form %}
            {{ field.label }}: {{ field.value }}
    {% endfor %}
</form>
Run Code Online (Sandbox Code Playgroud)

看看这里表单字段使用表单

  • 在 Django 术语中,这只适用于未绑定的表单。如果您希望它同时适用于未绑定和绑定表单怎么办? (2认同)

cai*_*aio 14

老话题,但我觉得有些人还来这里.

你也可以这样做:

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 '-'
Run Code Online (Sandbox Code Playgroud)

在你的形式

class SomeForm(Form):
   somename = forms.CharField(widget=PlainTextWidget)
Run Code Online (Sandbox Code Playgroud)


Mat*_*kel 5

您还可以使用一个新的小部件:我这样做是为了我可以有一个小部件来创建日期的文本显示,以及一个包含相同日期的隐藏表单,因此用户可以看到它,但他们不能更改。

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

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以在该字段中将其用作(widget=DayLabelWidget,).


pri*_*stc 5

另外,别忘了你也可以 {{myform.instance.name}}