1

私のモデルには、manytomany フィールドがあります

mentors = models.ManyToManyField(MentorArea, verbose_name='Areas', blank=True)

私のフォームでは、これを次のようにレンダリングします。

  1. オブジェクトに関連付けられていないすべての MentorArea オブジェクトのリストを含むドロップダウン ボックス。

  2. その隣には、それをオブジェクトに追加する JavaScript 関数を呼び出す追加ボタンがあります。

  3. 次に、その下に、選択された各 MentorArea オブジェクトを含む ul リストがあり、横に ax があり、オブジェクトから MentorArea を削除する JavaScript 関数を再度呼び出します。

フィールド要素のレンダリング方法を変更するには、カスタム ウィジェットを作成してレンダリング関数をオーバーライドすることを知っています。それを行って、追加ボタンを作成しました。

class AreaWidget(widgets.Select):

    def render(self, name, value, attrs=None, choices=()):
        jquery = u'''
        <input class="button def" type="button" value="Add" id="Add Area" />'''

        output = super(AreaWidget, self).render(name, value, attrs, choices)

        return output + mark_safe(jquery) 

ただし、現在選択されているものをリストとして下にリストする方法がわかりません。誰でも私を助けることができますか?また、追加されていない MentorArea オブジェクトのみが表示されるように、リストをフィルタリングする最良の方法は何ですか? 私は現在、フィールドを次のように持っています

mentors = forms.ModelMultipleChoiceField(queryset=MentorArea.objects.all(), widget = AreaWidget, required=False)

しかし、これは、メンターが追加されているかどうかに関係なく、すべてのメンターを示しています。

ありがとう

4

1 に答える 1

1

私にとって、あなたが説明した機能は、ModelAdminfilter_horizontalfilter_vertical設定を使用して達成できるものとよく似ています。それらがレンダリングするウィジェットは に住んでいdjango.contrib.admin.widgets.FilteredSelectMultipleます。そのコードを見てください。

于 2010-05-17T19:59:50.073 に答える