我正在编写一个自定义字段/小部件来显示相关数据的多个输入字段,例如我的产品有4个搜索字段,search1,search2,search3等等,而不是必须在我的表单中定义每个字段,i想要有一个字段,根据其长度显示我需要的所有输入字段(所有相关数据),这是我到目前为止所拥有的
class RelatedCategoryField(forms.MultiValueField):
"""
Custom field to display multiple input boxes for a related object
"""
def __init__(self, max_length, sub_max_length, label):
# sub_max_length, is the max_length of each subfield
self.total = max_length/sub_max_length
self.widget = CategoryWidget(self.total, label)
fields = ()
for num in range(self.total):
fields += (forms.CharField(label="%s-%s" %(label, num),
max_length=sub_max_length),)
super(RelatedCategoryField, self).__init__(fields, required=False)
def compress(self, value_list):
if value_list:
return value_list
return [[] for i in self.total]
class CategoryWidget(forms.MultiWidget):
"""
Custom widget
"""
def __init__(self, count, label):
self.count = count
self.label = label
widgets = [forms.TextInput(attrs={}) for sub in range(self.count)]
super(CategoryWidget, self).__init__(widgets)
def decompress(self, value):
if value:
return value
return [None for i in range(self.count)]
def format_output(self, rendered_widgets):
"""
Customize widget rendering
"""
return render_to_string('fields/categoryfield.html', {'fields': rendered_widgets})
所以基本上我这样称呼这个字段:
category = RelatedCategoryField(max_length=200, sub_max_length50, label="search")
然后根据sub_max_length
字段确定它将为此多值字段创建的字段数,然后字段标签将为label+field# ( search_1, search_2, etc.. )
上面的代码工作正常,但我的问题是,当显示时,字段只显示定义字段时提供的标签,然后它显示输入字段,我想显示每个输入字段及其相应的标签,总结一下我的问题,是否可以在多值字段中显示每个字段的标签?
答案 0 :(得分:1)
我不知道这是否是你要找的,因为它涉及编辑模板而不是表格。
在您的模板中,您可以执行以下操作:
# In form_snippet.html:
{% for field in form %}
<div class="fieldWrapper">
{{ field.label_tag }}: {{ field }}
</div>
{% endfor %}
来源:https://docs.djangoproject.com/en/dev/topics/forms/#customizing-the-form-template
答案 1 :(得分:1)
我在我的应用程序中做了类似的事情,定义format_output
如下:
def format_output(self, rendered_widgets):
return mark_safe(u'<p class="placewidget">%s %s %s<br />%s %s %s %s %s %s</p>' % (
_('Name:'), rendered_widgets[1],rendered_widgets[0],
_('ZIP:'), rendered_widgets[2],
_('City:'), rendered_widgets[3],
_('State:'), rendered_widgets[4],
))
这会分别呈现每个小部件及其标签。希望它有所帮助