How do I add plain text info to forms in a formset in Django?
我希望在每个表单中显示来自数据库查询的标题和描述,但我不希望它位于charfield中,我希望它是HTML格式的文本。
示例模板代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | {% for form, data in zipped_data %} <span class="title">{{ data.0 }}</span> {{ data.1|default:"None" }} {% for field in form %} {{ field.errors }} {{ field }} {% endfor %} {% endfor %} |
这是最惯用的方法吗?或者,是否有一种方法可以添加不会显示在文本区域内的文本或输入到我的模型的文本:
1 2 | class ReportForm(forms.Form): comment = forms.CharField() |
?
您可以覆盖表单上的构造函数,并将标题/描述保留为实例级成员变量,而不是使用其他数据压缩表单。这是一个更面向对象的方法,学习如何做到这一点将帮助您解决其他问题,如动态选择字段。
1 2 3 4 5 | class MyForm (forms.Form): def __init__ (self, title, desc, *args, **kwargs): self.title = title self.desc = desc super (MyForm, self).__init__ (*args, **kwargs) # call base class |
然后在视图代码中:
1 | form = MyForm ('Title A', 'Description A') |
如果需要这些值来自数据库,请相应地进行调整。然后,在模板中,您可以像访问其他操作一样访问实例变量,例如:
1 2 3 4 | {{ form.title }} <p> {{ form.desc }} </p> |
从您表述问题的方式来看,我认为您可能对Django使用Python类属性提供声明性表单API的方式和应用于单个类实例的实例级属性(在本例中是表单对象)有些困惑。
- 查看此链接,以便对区别进行很好的讨论
- 这一个
我刚刚通过对文本输入字段1的子类化创建了一个只读小部件:
1 2 3 4 5 6 7 | class ReadOnlyText(forms.TextInput): input_type = 'text' def render(self, name, value, attrs=None): if value is None: value = '' return value |
还有:
1 2 | class ReportForm(forms.Form): comment = forms.CharField(widget=ReadOnlyText, label='comment') |
我不得不解决一个类似的问题,并且喜欢你的想法,安德烈。不过,我在使用它时遇到了一些问题,因为如果存在验证错误,只读字段的值就会丢失。为了解决这个问题,我做了一些类似的事情,但却忽略了hiddeninput,并将值保存在一个隐藏的表单字段中。IE:
1 2 3 4 5 6 7 8 9 10 | 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') |
我想你可以用"field.value"来获得它。也许这是更简单的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 | {% for form in formset %} {% for field in form %} {% if forloop.counter = 1 %} <td><img src="{{ MEDIA_URL }}{{ field.value }}"/></td> {% endif %} {% if forloop.counter = 2 %} <td>{{ field.value }}</td> {% endif %} {% if forloop.counter > 2 %} <td>{{ field }}{{ field.errors }}</td> {% endif %} {% endfor %} {% endfor %} |