如何在Django的表单集中添加纯文本信息?
如何在Django的表单集中添加纯文本信息?
我想在每个表单中显示来自数据库查询的标题和描述,但我不希望它是在charfield中,我希望它是HTML格式的文本。
示例模板代码:
{% for form, data in zipped_data %}
{{ data.0 }}
{{ data.1|default:"None" }}
{% for field in form %}
{{ field.errors }}
{{ field }}
{% endfor %}
{% endfor %}
这是最常见的方法吗?还是有一种方法可以在我的模型中添加不会显示在文本区域或文本输入框中的文本:
class ReportForm(forms.Form): comment = forms.CharField()
?
问题的原因是在使用Django的formset时,如果想在表单中添加纯文本信息,会遇到一个问题:如果遇到验证错误,只读字段的值会丢失。
解决方法是通过重写HiddenInput类,将值保存在隐藏的表单字段中。代码如下:
class ReadOnlyText(forms.HiddenInput): input_type = 'hidden' def render(self, name, value, attrs=None): if value is None: value = '' return mark_safe(value + super(ReadOnlyTextWidget, self).render(name, value, attrs)) class ReportForm(forms.Form): comment = forms.CharField(widget=ReadOnlyText, label='comment')
然而,这种方法是不安全的,因为用户可以更改隐藏输入的内容,并使您保存数据库中的某些值。但是,实际上并不需要使用数据库,因为这只是一个表单。如果只有一个表单字段,用户可以随意更改其中的任何内容。如果不需要在表单的保存方法中使用"comment"的值,那么这种情况下可以不用担心用户更改值的问题。
问题的原因是在Django中的表单集(formset)中如何添加纯文本信息到表单中。解决方法是通过在表单的构造函数中重写构造函数,并将标题/描述作为实例级成员变量。然后在视图代码中实例化表单,并在模板中通过访问实例变量来显示标题和描述。
在Django中,使用Python的类属性提供声明式表单API,而将实例级属性应用于类的实例,也就是表单对象。
要了解更多关于类属性和实例属性的区别,请参考以下链接:
- [Python Difference between class and instance attributes](https://stackoverflow.com/questions/207000)
- [Why do attribute references act like this with Python inheritance](https://stackoverflow.com/questions/206734)
请记得将解决方案标记为接受的答案,以便其他人可以轻松找到解决方案,并为您提供声望积分。
问题的原因是用户想要在Django的表单集(formset)中添加纯文本信息,但是目前的实现方式只能添加可编辑的表单字段。
解决方法是通过创建一个只读(read-only)的小部件(widget)来实现。用户通过继承文本输入字段(TextInput)创建了一个只读的小部件(ReadOnlyText),并在其中重写了render方法。在这个方法中,如果值(value)为空,将其设为一个空字符串,然后将其返回。
接着,在创建表单(ReportForm)时,用户将评论字段(comment)的小部件设置为刚才创建的只读小部件(ReadOnlyText)。
这样,用户就成功地在表单集中添加了纯文本信息。