2011-02-15 6 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,) 

을 알려주세요?

그래서, 자세한 summary- 에 내 질문에 어떻게 해당 formset의 모든 "registered_by"필드에 request.session 데이터 (첫번째 & 성 및 이메일) (보기 = guest_list_add, 모델 = GuestsAttending) 감사를 추가 할 수 있습니다 !

+0

참조 장고 문서 : https://docs.djangoproject.com/en/1.7/topics/forms/formsets/#adding-additional-fields-to-a-formset – CpILL

답변

1

데이터베이스에 저장하기 직전에 해당 추가 "리퍼러"데이터로 formset을 채워 보았습니까?

예를 들어, modelform formsets에 대한 django 문서의 saving objects in the formset 섹션에서 formset에서 save(commit=False)을 수행 한 다음 formset 내부의 인스턴스를 반복하면 formset에서 항목을 처리 할 수 ​​있습니다. 그렇게하면, 예를 들어 당신이 원하면 무엇이든 할 수 있습니다 : 리퍼러 데이터로 채울 수 있습니다.

+0

감사합니다! 나는 아래의 다른 답변에서 제공되는 코드와 비슷한 것을 사용하고 있지만 귀하의 대답은 동일하므로 (그리고 첫 번째로) 체크 표시를 해 둡니다. –

+0

공정성으로 인해 영광을 얻었습니다. 선생님. –

4

왜 양식 집합에서 숨겨진 필드가 필요합니까? 보기에서 해당 항목에 액세스 할 수 있습니다. 왜 그 위치에 있지 않을까요?

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() 
+0

감사합니다. 나는 폼 모드에서 생각하고 있었고 db 엔트리를 처리하기 위해 어떤 형태의 폼 입력이 필요하다고 가정했다. –

+0

이 작은 발언의 4 번째 라인은 2 % s와 (요청 ....) 사이에 %가 있어야합니다. "% s % s"% (request.session ... 다시 한번 감사드립니다. –

+0

감사합니다. 내 문제를 해결했습니다. :-) – allardbrain

관련 문제