如何提供Django label_tag和as_widget参数(例如内容和attrs)

时间:2013-03-24 08:37:16

标签: python django python-2.7 django-templates django-views

来自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 :(得分:0)

Django非常刻意地限制模板功能,以确保您不会像使用PHP那样在模板中编写整个网站。

来自The Django Book 2.0: Templates: Philosophies and Limitations

  

...直接在Django中调用Python代码是不可能的   模板。所有“编程”从根本上限于范围   什么模板标签可以做。

可以 write a custom template tag or filter做你想要的...... 但是 - 因为这似乎是形式逻辑 - 你几乎肯定会做得更好别的什么。

最简单的方法是定义表单定义的标签/小部件。即:

from django import forms

class MyForm(forms.Form):
    my_field = forms.CharField(label='My label', widget=forms.Textarea)

也就是说,对于小部件,有other documented ways。如果您使用django-floppy-forms,则可以轻松覆盖用于渲染它们的整个模板。

最后,我强烈推荐django-crispyforms。它可以为您节省大量时间,因为您不再需要在模板中手写表单。