如何提供Django的label_tag和as_widget参数(如内容和属性)
来自 django/forms/forms.py 的内容:
def label_tag(self, contents=None, attrs=None):
..
def as_widget(self, widget=None, attrs=None, only_initial=False):
..
在我的模板中,我这样调用 label_tag:
{{ form.my_field.label_tag }}
这样就会输出标签。
我应该如何按照它们的定义来提供这些标签的参数呢?比如说,我想提供一个替代的标签文本和 CSS 类。
我尝试了类似这样的写法:
{{ form.my_field.label_tag contents='My alternative label' }}
但是它给我的结果是:
Could not parse the remainder: ' contents='My alternative label'' from 'form.code.label_tag contents='My alternative label''
对于 attrs 字段也是一样。我能从模板中为它提供一个值吗?我想提供 CSS 类。目前我在使用一个过滤器来处理 CSS 类,但在查看 Django 的源代码时,我注意到 label_tag 和 as_widget 有这些额外的参数,这让我想知道我如何能从我的模板中提供这些参数。
(我在 App Engine 上使用 Django 1.4)
1 个回答
0
Django为了确保你不会像用PHP那样在模板里写整个网站,故意限制了模板的功能。
来自《Django书籍2.0:模板:哲学与限制》的内容:
...在Django模板中,直接调用Python代码是不可能的。所有的“编程”基本上都被限制在模板标签能做的范围内。
你可以 写一个自定义的模板标签或过滤器来实现你想要的功能……但是——因为这似乎是表单逻辑——你几乎肯定会发现做其他事情会更好。
最简单的方法可能是在定义表单的地方定义标签/小部件。也就是说:
from django import forms
class MyForm(forms.Form):
my_field = forms.CharField(label='My label', widget=forms.Textarea)
话虽如此,对于小部件,还有其他文档中提到的方法。如果你使用django-floppy-forms,你可以轻松覆盖用于渲染它们的整个模板。
最后,我强烈推荐django-crispyforms。它能为你节省很多时间,因为你不再需要在模板中手动编写表单。