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

qc6wkl3g  于 2023-04-22  发布在  Go
关注(0)|答案(7)|浏览(180)

有没有简单的方法让Django将{{myform.name}}渲染为

John Smith

而不是

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

<form>标签中?或者我的方法是错误的?

rn0zuynd

rn0zuynd1#

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

在这里查看表单字段和Working with forms

ecr0jaav

ecr0jaav2#

老主题了,但我想还是有人来的。
你也可以这样做:

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)

在Django 2.1+下,你需要以下内容:

from django.utils.safestring import mark_safe

class PlainTextWidget(forms.Widget):
    def render(self, name, value, attrs=None, renderer=None):
        return mark_safe(value) if value is not None else '-'
kwvwclae

kwvwclae3#

您还可以使用一个新的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,)

vlju58qv

vlju58qv4#

另外,不要忘记您还可以执行{{myform.instance.name}}

jobtbby3

jobtbby35#

我想这就是你想要的http://code.djangoproject.com/ticket/10427
我修补了我的 Django ,瞧...

gdrx4gfi

gdrx4gfi6#

下面是@Matthew_Schinkel建议的方法,使用Django 2.2和python 3。

from django import forms
from django.utils.safestring import mark_safe

class PlainTextWidgetWithHiddenCopy(forms.Widget):
    def render(self, name, value, attrs=None, 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标记,该标记创建一个与原始字段具有相同名称和值的隐藏字段。
这意味着,除了向用户显示值之外,浏览器还保存该值,并将其向前发送到处理提交表单的视图。
如果表单POST到自身,这一点特别方便,否则纯文本数据将消失,因为字段的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在他随后的评论中正确指出的那样,这种方法对用户更改发送回隐藏字段的数据没有提供任何有效的保护。

ut6juiuv

ut6juiuv7#

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

相关问题