Django Forms and ModelChoiceField:将htmloptgroup元素添加到QuerySet中的特定对象?

2024-10-01 09:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

class CreateCourseForm(ModelForm):
        category = forms.ModelChoiceField(
            queryset=Category.objects.all(),
            empty_label="",
            #widget=CustomCourseWidget()
        )

    class Meta:
        model = Course
        fields = ('title', 'description', 'category')

    def __init__(self, *args, **kwargs):
        super(CreateCourseForm, self).__init__(*args, **kwargs)
        self.fields['category'].widget.attrs['class'] = 'chzn-select'
        self.fields['category'].widget.attrs['data-placeholder'] = u'Please select one'

通过上面的代码,我得到了一个包含所有Category对象的选择框。我要做的是添加一个

^{pr2}$

HTML元素到特定类别对象(具有类别.父项==空)。在

有人知道怎么做吗?谢谢!在

PS:我已经尝试过将QuerySet转换为Choices集(例如http://dealingit.wordpress.com/2009/10/26/django-tip-showing-optgroup-in-a-modelform/),这对于呈现HTML效果很好-直到我试图将结果保存到数据库中,在那里会发生不匹配(ValueError)。在


Tags: 对象selffieldsinithtmlargswidget类别
1条回答
网友
1楼 · 发布于 2024-10-01 09:33:59

这是我目前的解决方案。这可能是一个肮脏的修补程序,但它工作得很好:-)

class CustomCourseWidget(forms.Select):
    #http://djangosnippets.org/snippets/200/
    def render(self, name, value, attrs=None, choices=()):
        from django.utils.html import escape
        from django.utils.encoding import smart_unicode
        from django.forms.util import flatatt

        if value is None:
            value = ''
        final_attrs = self.build_attrs(attrs, name=name)
        output = [u'<select%s>' % flatatt(final_attrs)]
        output.append(u'<option value=""></option>') # Empty line for default text
        str_value = smart_unicode(value)
        optgroup_open = False
        for group in self.choices:
            option_value = smart_unicode(group[0])
            option_label = smart_unicode(group[1])
            if not ">" in option_label and optgroup_open == True:
                output.append(u'</optgroup>')
                optgroup_open = False
            if not ">" in option_label and optgroup_open == False:
                output.append(u'<optgroup label="%s">' % escape(option_label))
                optgroup_open = True
            if " > " in option_label:
                #optgroup_open = True
                selected_html = (option_value == str_value) and u' selected="selected"' or ''
                output.append(u'<option value="%s"%s>%s</option>' % (escape(option_value), selected_html, escape(option_label.split(" > ")[1])))

        output.append(u'</select>')
        return mark_safe(u'\n'.join(output))

相关问题 更多 >