2
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'

上記のコードでは、すべてのカテゴリ オブジェクトが一覧表示された選択ボックスが表示されます。私がやろうとしているのは、追加することです

<optgroup>VALUE</optgroup> 

HTML 要素から特定の Category-Object (Category.parent == null のもの) へ。

誰もそれを行う方法を知っていますか? どうもありがとう!

PS: 私はすでに QuerySet を Choices-Set に変換しようとしました (例: http://dealingit.wordpress.com/2009/10/26/django-tip-showing-optgroup-in-a-modelform/ )。 HTML をレンダリングするため - 不一致が発生する DB に結果を保存しようとするまで (ValueError)。

4

1 に答える 1

1

これが私の現在の解決策です。汚い修正かもしれませんが、うまくいきます:-)

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))
于 2012-09-07T07:30:21.080 に答える