Создание формы динамически - PullRequest
1 голос
/ 07 июня 2010

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

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

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

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

Поскольку мне нужно передать параметры в форму, я использовал эту технику из предыдущего сообщения 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)))

Но бит добавления не работает. Как правильно это сделать?

Спасибо!

1 Ответ

4 голосов
/ 07 июня 2010

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

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

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)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...