2011-02-15 60 views
0

我正在處理一個RSVP表單的項目。現在我可以處理他們的基本信息,包括他們帶來的額外客人數量。然後這個數字用於填充下一頁上的formset中的X個字段,這些字段只是要求客人的姓名和評論。Django如何將隱藏字段添加到formset並填充它們?

我期望能夠做的就是添加一個隱藏字段到客人姓名的formset中,該姓名將包含將他們註冊爲即將到來的人的姓名。

我已經通過會話數據預先填充了第一個客人姓名和註冊客人的信息,我有一個會話變量定義,可以填充隱藏字段。我只需要知道如何將該字段添加到formset。

從django.db進口車型

#models.py 
class Guest(models.Model): 
    ATTENDING_CHOICES = (
     (u'Yes', u'Yes'), 
     (u'No', u'No'), 
     (u'Maybe', u'Maybe?') 
    ) 

    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    email = models.EmailField(max_length=50) 
    attending = models.CharField(max_length=15, choices=ATTENDING_CHOICES) 
    no_of_guests = models.IntegerField(verbose_name='Total # of guests', max_length=3) 
    notes = models.TextField(null=True, blank=True) 
    def __unicode__(self): 
     return u'%s, %s - %s' % (self.last_name, self.first_name, self.email) 

class GuestsAttending(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    comments = models.CharField(null=True, blank=True, max_length=100) 
    #This is the field that I would like to be hidden and filled 
    registered_by = models.CharField(max_length=40, blank=True, null=True, editable=False) 
    def __unicode__(self): 
     return u'%s %s' % (self.last_name, self.first_name) 

和瀏覽次數:

#views.py 
from django.forms.models import modelformset_factory 

def guest_create(request): 
    context_instance=RequestContext(request) 
    if request.method == 'POST': 
     form = GuestForm(request.POST) 
     if form.is_valid(): 
      request.session['first_name']= request.POST['first_name'] 
      request.session['last_name']= request.POST['last_name'] 
      request.session['e_mail']= request.POST['email'] 
      request.session['no_of_guests']= request.POST['no_of_guests'] 
      form.save() 
      return HttpResponseRedirect('/guest_list_add/') 
    else: 
     form = GuestForm() 
    return render_to_response('rsvp.html', locals(), context_instance,) 

def guest_list_add(request): 
    n = int(request.session['no_of_guests']) 
    context_instance=RequestContext(request) 
    GuestFormset = modelformset_factory(GuestsAttending, extra=int(n)) 
    if request.method == 'POST': 
     formset = GuestFormset(request.POST) 
     if formset.is_valid(): 
      instance = formset.save() 
      return HttpResponseRedirect('/submitted/') 
    else: 
     formset = GuestFormset(queryset=GuestsAttending.objects.none(), initial=[ 
      {'first_name': request.session['first_name'], 
      'last_name': request.session['last_name'], 
     ]) 
    return render_to_response('guest_list_add.html', locals(), context_instance,) 

讓我知道,如果你想看到的任何另外代碼 - 喜歡的模板可能?

所以,我在一個詳細的總結 - 問題,我怎樣才能增加我的表單集的request.session數據(第一&姓氏和電子郵件),以每一個「registered_by」領域(查看= guest_list_add,模型= GuestsAttending) 謝謝!

+0

見Django文檔:https://docs.djangoproject.com/en/1.7/topics/forms/formsets/#adding-additional-fields-to-a-formset – CpILL 2015-01-13 03:50:36

回答

1

您是否曾嘗試在將其保存到數據庫之前使用額外的「引用者」數據填充您的formset?

例如,在模型表單集的django文檔的saving objects in the formset部分中,如果對錶單集執行save(commit=False),然後對錶單集內的實例進行迭代,則會看到可以處理表單集上的項。這樣,你就可以隨心所欲地做任何事情,例如:你可以填寫你的推薦人數據。

+0

謝謝!我正在使用類似於下面其他答案中提供的代碼,但你的答案是相同的(和第一),所以我給你了複選標記。 – 2011-02-16 16:41:31

+0

我對你的公平感到榮幸,先生。 – 2011-02-16 17:47:29

4

爲什麼它需要是formset中的隱藏字段?你可以在視圖中訪問那些東西,爲什麼不在那裏做呢?

if formset.is_valid(): 
    for form in formset: 
     guest = form.save(commit=False) 
     guest.invited_by = "%s %s" (request.session['first_name'], request.session['last_name']) 
     guest.save()