如何提供Django的label_tag和as_widget参数(如内容和属性)

0 投票
1 回答
2362 浏览
提问于 2025-04-17 20:07

来自 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。它能为你节省很多时间,因为你不再需要在模板中手动编写表单。

撰写回答