2010-06-07 3 views
1

Я изначально написал код для динамического создания формы на основе данных из БД, аналогично тому, что я описал в своем previous SO post.Создание динамического набора форм

Как пользователь Даниил Роземан указывает, что он использовал бы форму для этого, и теперь я пришел к осознанию того, что он должен быть совершенно прав. :)

Мой подход работает, в основном, но я не могу заставить валидацию по всей форме работать должным образом (я считаю, что это возможно, но она становится довольно сложной, и должен быть более разумный способ do => Formsets!).

Итак, теперь мой вопрос: как я могу построить динамический набор форм? Не для AJAX, я хочу, чтобы метка каждой формы была заполнена значением FK (командой) из БД.

Как мне нужно передать параметры в форму, я использовал this technique из предыдущего сообщения SO.

С первого подхода, на мой взгляд код (код в предыдущей ссылке):

def render_form(request): 
    teams = Team.objects.filter(game=game) 
    form_collection = [] 
    for team in teams: 
      f = SuggestionForm(request.POST or None, team=team, user=request.user) 
      form_collection.append(f) 

Теперь я хочу сделать что-то вроде:

def render_form(request): 
    teams = Team.objects.filter(game=game) 
    from django.utils.functional import curry 
    from django.forms.formsets import formset_factory 

    formset = formset_factory(SuggestionForm) 
    for team in teams: 
     formset.form.append(staticmethod(curry(SuggestionForm, request.POST or None, team=team, user=request.user))) 

Но немного Append не Работа. Каков правильный способ сделать это?

Спасибо!

ответ

4

Спасибо за признание моей правоты неизменной ...

Возможно, что вам нужно здесь является model formset, которая будет автоматически строить себя от QuerySet вы передаете в:

from django.forms.models import modelformset_factory 

def render_form(request): 
    teams = Team.objects.filter(game=game) 
    formset = modelformset_factory(form=SuggestionForm, queryset=teams) 

Что касается динамический параметр, который я предполагаю, что это user, я ранее использовал решение закрытия, но метод curry должен работать:

formset.form = staticmethod(curry(SuggestionForm, user=request.user)) 

Редактировать после комментария Спасибо за разъяснение. Думаю, я понимаю, что вы пытаетесь сделать. Интересно, может ли встроенный набор форм работать лучше? Если вы начали с объекта Game, предварительно заполненного восемью связанными объектами Team, встроенный набор форм предоставит вам восемь ранее существовавших форм.

my_game = Game.objects.create(params=whatever) 
for i in range(1, 9): 
    team = Team.objects.create(game=my_game, name="team_%s" % i 

formset = inlinemodelformset_factory(Game, Team, form=SuggestionForm) 
fs = formset(instance=my_game) 

Это работает?

+0

Спасибо, и вам все же нравится :). Теперь я получаю одну форму с выпадающим списком для команд. Я хочу, чтобы каждая команда была ярлыком в форме и использовала радиокнопки для выбора. Это означает, что если у меня 8 команд, отображается список (или строка ...) с 8 элементами. Вот почему я хотел сделать «добавление» форм. Это возможно? – vorpyg

+1

+1 для «неизменяемости правоты ...». – cethegeek

+0

Отлично! Огромное спасибо. – vorpyg

Смежные вопросы