2013-04-15 1 views
0

Я пытаюсь создать набор форм, каждый из которых содержит поле ввода. Это будет иметь некоторое динамическое количество элементов, и как только форма будет отправлена, введенный текст будет назначен как «теги» для связанного объекта. Это может показаться своего рода запутанным так давайте посмотрим на класс формы я пытаюсь сделать:Давать значения каждой форме в наборе форм в Django

class TagsForm(forms.Form): 

    tags = forms.CharField() 
    def __init__(self, *args, **kwargs): 
     applicantId = kwargs.pop('applicantId') 

    def saveTags(self): 
     applicant = Applicants.objects.get(id=applicantId) 
     Tag.update(applicant,tags) 

Как вы можете видеть, что я хотел бы передать идентификатор формы от заявителя, а затем по получать запрос после обновления метки для этого объекта-заявителя путем вызова каждой формы saveTags. Вот код с моей точки зрения, где я обработки:

... 
    applicantQuery = allApplicantsQuery.filter(**kwargs) 
    TagsFormSet = formset_factory(TagsForm) 
    if request.method == 'POST': 
     tags_formset = TagsFormSet(request.POST, request.FILES, prefix='tags') 
     if tags_formset.is_valid() 
      for tagForm in tags_formset: 
       tagForm.saveTags() 
    else: 
     tags_formset = TagsFormSet(prefix='tags') 
    ... 

Проблема заключается в том, я не знаю, как создать исходный набор форм с идентификаторами из QuerySet applicantQuery. В идеале я могу просто запрограммировать запрос и отправить request.id в каждую форму, но я не уверен, как это сделать. Я также считаю, что я должен упомянуть, что набор форм должен иметь точно такое же количество форм, как и заявители в кандидатахQuery.

ответ

2

Вы можете написать индивидуальный набор форм.

from django.forms.formsets import BaseFormSet 

class TagFormSet(BaseFormSet): 

    def __init__(self, *args, **kwargs): 
     applicants = kwargs.pop('applicants') 
     super(TagFormSet, self).__init__(*args, **kwargs) 
     #after call to super, self.forms is populated with the forms 

     #associating first form with first applicant, second form with second applicant and so on 
     for index, form in enumerate(self.forms): 
      form.applicant = applicants[index] 

Теперь вам не нужно переопределить __init__ из TagsForm.

Теперь каждая ваша форма связана с заявителем. Таким образом, вы можете удалить первую строку своего saveTags(). Так saveTags() становятся:

def saveTags(self): 
    #applicant was set on each form in the init of formset 
    Tag.update(self.applicant, tags) 

Ваше мнение код:

applicantQuery = allApplicantsQuery.filter(**kwargs) 

#notice we will use our custom formset now 
#also you need to provide `extra` keyword argument so that formset will contain as many forms as the number of applicants 
TagsFormSet = formset_factory(TagsForm, formset=TagFormSet, extra=applicantQuery.count()) 

if request.method == 'POST': 
    tags_formset = TagsFormSet(request.POST, request.FILES, prefix='tags', applicants=applicantQuery) 
    if tags_formset.is_valid() 
     for tagForm in tags_formset: 
      tagForm.saveTags() 
else: 
    tags_formset = TagsFormSet(prefix='tags', applicants=applicantQuery) 
+0

Ничего себе, это прекрасно! Спасибо! – James

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