【问题标题】:Django: customize form in template according to field attributeDjango:根据字段属性在模板中自定义表单
【发布时间】:2011-01-10 20:09:09
【问题描述】:

我有如下所示的 Category 模型和 SearchForm 表单。我想在我的模板中做两件事:

-在表单中分离具有给定类型的 Category 实例,以便能够在我的 CSS 中将特定样式应用于它们

-显示我的类别实例的层次结构

基本上,我需要在模板中访问类别的父级和样式,或者修改表单的呈现。 我怎样才能做到这一点? 谢谢 七月

类别模型

CATEGORY_TYPE = [
    (1, 'region'),
    (2, 'type'),
]

class Category(models.Model):

    parent = models.ManyToManyField('self', symmetrical=False, null=True, blank=True)
    type = models.PositiveSmallIntegerField(choices=CATEGORY_TYPE)

    class Translation(multilingual.Translation):
        name = models.CharField(max_length=100, unique=True)

    class Meta:
        verbose_name_plural = 'Categories'

    def __unicode__(self):
        return "%s" %(self.name)

SearchForm 类

class SearchForm(forms.Form):

    query = forms.CharField(max_length=100, required=False)
    price_range = forms.IntegerField(widget=forms.Select(choices = PRICE_RANGES_AND_EMPTY), required=False)

    def __init__(self, *args, **kwargs):
        super(SearchForm, self).__init__(*args, **kwargs)
        self.fields['country'] = forms.ModelChoiceField(queryset=Country.objects.all().order_by('name'), empty_label='All', required=False)
        self.fields['category'] = forms.ModelMultipleChoiceField(queryset=Category.objects.all().order_by('name'),
widget=forms.CheckboxSelectMultiple(), required=False) 

【问题讨论】:

    标签: django forms templates


    【解决方案1】:

    为什么parentManyToManyField?一个类别可以有多个父级吗?

    以下应显示category 及其后代并突出显示special 类型的类别:

    在 Python 中:

    class Level:
        def __init__(self, value):
            self.value = value
    
        def __str__(self):
            return str(self.value)
    
        def inc(self):
            return Level(self.value + 1)
    
    render_to_response("render_category.html", { 'level' : Level(0), 'category' : category, 'special' : special })
    

    render_category.html:

    <div class = "category {% ifequal category.type special %}special{% endif %} level-{{ level }}">
        {% for child in category.category_set.all %}
            {% with child as category %}
                {% with level.inc as level %}
                    {% include "render_category.html" %}
                {% endwith %}
            {% endwith %}
        {% endfor %}
    </div>
    

    【讨论】:

    • 是的,一个类别可以有多个父类别。有没有办法修改表单的呈现方式?
    • 我不这么认为,但是您真的需要类别列表作为表单的一部分吗?您可以单独渲染它并将所有内容包含在
      标记中。如果一个类别可以有多个父级,您是否希望它多次显示?如果是,只需为每个顶级类别调用 render_category。如果不是,您可能应该为此定义一个自定义标签。
    猜你喜欢
    • 2023-04-09
    • 2011-06-15
    • 2022-01-24
    • 1970-01-01
    • 2020-03-24
    • 2011-08-19
    • 2012-12-11
    • 2012-06-05
    • 1970-01-01
    相关资源
    最近更新 更多