Django Forms - изменить виджет множественного выбора рендера - PullRequest
1 голос
/ 17 мая 2010

В моей модели у меня много полей

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

В моей форме я хочу сделать это как:

  1. раскрывающийся список со списком всех MentorArea объекты, которые не имеют был связан с объектом.

  2. Рядом с этим кнопка добавления, которая вызовет функцию JavaScript который добавит его к объекту.

  3. Затем в списке ul, который имеет каждый выбранный объект MentorArea с х рядом с ним, который снова вызывает функция JavaScript, которая будет удалить MentorArea из объект.

Я знаю, что для изменения способа визуализации элемента поля вы создаете пользовательский виджет и переопределяете функцию рендеринга, и я сделал это для создания кнопки добавления.

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)

но это показывает всех наставников, независимо от того, были ли они добавлены или нет.

Спасибо

1 Ответ

1 голос
/ 17 мая 2010

Для меня описанная вами функциональность очень похожа на то, что вы можете достичь с помощью настроек ModelAdmin 'filter_horizontal и filter_vertical. Виджет, который они отображают, живет в django.contrib.admin.widgets.FilteredSelectMultiple. Вы должны взглянуть на его код!

...