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 '-'
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}'>"
)
7条答案
按热度按时间rn0zuynd1#
在这里查看表单字段和Working with forms
ecr0jaav2#
老主题了,但我想还是有人来的。
你也可以这样做:
以你的形式
在Django 2.1+下,你需要以下内容:
kwvwclae3#
您还可以使用一个新的widget:我这样做是为了有一个小部件来创建一个日期的文本显示,以及一个隐藏的表单,其中包含相同的日期,这样用户就可以看到它,但他们不能更改它。
以下是一个初始(仍在测试/待清理)版本:
然后在字段中将其用作
(widget=DayLabelWidget,)
。vlju58qv4#
另外,不要忘记您还可以执行
{{myform.instance.name}}
jobtbby35#
我想这就是你想要的http://code.djangoproject.com/ticket/10427
我修补了我的 Django ,瞧...
gdrx4gfi6#
下面是@Matthew_Schinkel建议的方法,使用Django 2.2和python 3。
这是一个自定义小部件,它将字段的内容呈现为纯文本,后跟一个html标记,该标记创建一个与原始字段具有相同名称和值的隐藏字段。
这意味着,除了向用户显示值之外,浏览器还保存该值,并将其向前发送到处理提交表单的视图。
如果表单POST到自身,这一点特别方便,否则纯文本数据将消失,因为字段的
initial
值尚未设置。例如,如果您的表单包含:
然后这个字段将呈现为下面的html:
提交表单时,相应视图接收的POST数据将包括:
这意味着如果视图现在重新呈现表单,那么
my_field
的值将再次设置为12345
,就像请求是GET
一样。正如Matthew在他随后的评论中正确指出的那样,这种方法对用户更改发送回隐藏字段的数据没有提供任何有效的保护。
ut6juiuv7#
为什么不使用{{field.data}}?