在 Django 中只渲染 MultiWidget 的一部分 [英] Render only one part of a MultiWidget in Django
问题描述
我有一个带有 MultiWidget 的 Django 表单字段,其中包含两个 TextInput.
I have a Django Form Field with a MultiWidget that consists of two TextInputs.
在模板中渲染表单时,有一个方便的符号
When rendering the form in a template there is the handy notation
{{ formname.fieldname }}
用于渲染单个字段.当我将它用于带有 MultiWidget 的字段时,它将显示两个 HTML 输入元素.是否对仅显示第一个 HTML 输入元素的符号稍作修改?({{ formname.fieldname.0 }}
不起作用.)
for rendering a single field. When I use it for the field with the MultiWidget, it will display both HTML input elements. Is there a slight modification of the notation that will display only the first HTML input element? ({{ formname.fieldname.0 }}
does not work.)
推荐答案
我找到了解决这个问题的方法,需要两段代码.
I found a solution to this problem that needs two pieces of code.
第一
将MultiWidget转成字符串的render
方法比较长.我们需要复制并粘贴它,并在最后一行稍作修改,使其返回一个数组.
The render
method that turns the MultiWidget into a string is relatively long. We need to copy&paste it with a tiny modification in the last line to make it returing an array instead.
class OurMultiWidget(forms.MultiWidget):
...
def render(self, name, value, attrs=None):
"""Copy and past from original render method"""
if self.is_localized:
for widget in self.widgets:
widget.is_localized = self.is_localized
# value is a list of values, each corresponding to a widget
# in self.widgets.
if not isinstance(value, list):
value = self.decompress(value)
output = []
final_attrs = self.build_attrs(attrs)
id_ = final_attrs.get('id', None)
for i, widget in enumerate(self.widgets):
try:
widget_value = value[i]
except IndexError:
widget_value = None
if id_:
final_attrs = dict(final_attrs, id='%s_%s' % (id_, i))
output.append(widget.render(name + '_%s' % i, widget_value, final_attrs))
# Original:
# return mark_safe(self.format_output(output))
# Only this line was written by myself:
return [mark_safe(self.format_output(x)) for x in output]
第二
在模板中写入{{ formname.fieldname }}
会自动调用字段的unicode方法并将结果作为字符串处理.因为我们想要一个数组,所以我们需要绕过 unicode 方法并直接访问它将返回的内容.这就是方法 as_widget
.因此,要调用 OurMultiWidget
的第一部分,我们需要在模板中使用以下代码:
Writing {{ formname.fieldname }}
in the template will automatically call the field's unicode method and treat the result as a string. As we want an array instead, we need to circumvent the unicode method and access directly what it will return. And this is the method as_widget
. Thus, to call the first part of OurMultiWidget
, we will need this code in the template:
{{ formname.fieldname.as_widget.0 }}
这篇关于在 Django 中只渲染 MultiWidget 的一部分的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!