Ограничение доступных вариантов в наборе форм Django - PullRequest
0 голосов
/ 15 июля 2009

У меня есть набор форм, в котором есть поле «Команды», которое должно быть ограничено командами, к которым принадлежит текущий пользователь.

def edit_scrapbook(request):
    u=request.user
    ScrapbookAjaxForm = modelformset_factory(Scrapbook, fields=
          ('description','status','team'))
    choices=False
    for t in u.team_set.all():
        if choices:
            choices=choices,(t.id,t.name)
        else:
            choices=choices,(t.id,t.name)
   if request.method == 'POST':
        formset = ScrapbookAjaxForm(request.POST, 
            queryset=Scrapbook.objects.filter(owner=u))
        if formset.is_valid():
            instances=formset.save(commit=False)
            for i in instances:
                i.owner=request.user
                i.save()
            formset.save_m2m()    
            return HttpResponseRedirect(reverse('scrapbooks.views.index'))
    else:
        formset = ScrapbookAjaxForm(queryset=Scrapbook.objects.filter(owner=u))
        for form in forms:
            for field in form:
                if field.label == 'Team':
                    field.choices=choices
    c=RequestContext(request)
    return render_to_response('scrapbooks/ajax_edit.html', 
             {'fs':formset},context_instance=c)

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

Как ограничить выбор поля «Команда» в моем подвыборе в наборе форм на основе команд, в которых находится пользователь?

Ответы [ 2 ]

1 голос
/ 15 июля 2009

Из документации по модели django :

Наконец, обратите внимание, что выбор может быть любым повторяемый объект - не обязательно список или кортеж Это позволяет вам построить выбор динамически. Но если вы найдете хакерский выбор динамичный, вы, вероятно, лучше используя правильную таблицу базы данных с Иностранный ключ. выбор предназначен для статические данные, которые не сильно меняются, если когда-либо.

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

Некоторые дальнейшие предложения:

0 голосов
/ 15 июля 2009

Не уверен, что это является причиной проблемы, но есть большая проблема с тем, как вы строите кортеж выбора.

После четырех команд выбор будет выглядеть так:

((((False, (1, u'Team 1')), (2L, u'Team 2')), (3, u'Team 3')), (4, u'Team 4'))

, что явно недопустимо для установки поля выбора. Гораздо лучший способ сделать это - использовать понимание списка вместо всего цикла:

choices = [(t.id,t.name) for t in u.team_set.all()]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...