Django-如何将隐藏字段添加到formset并填充它们?

时间:2011-02-15 16:43:52

标签: django django-models django-forms

我正在开发一个有RSVP表格的项目。现在我有它的功能来处理他们的基本信息,包括他们带来的额外客人的数量。然后,此数字用于填充下一页的表单集中的X个字段,这些字段仅询问客户名称和注释。

我希望能够做的是在客人名称的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数据(名字和姓氏和电子邮件)添加到我的formset中的每个“registered_by”字段(view = guest_list_add,model = GuestsAttending) 谢谢!

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:2)

您是否尝试在将其保存到数据库之前使用其他“引荐来源”数据填充您的formset?

例如,在django关于modelform formsets的文档的saving objects in the formset部分中,如果在formset上执行save(commit=False),然后迭代,您将看到可以处理formset上的项目formset中的实例。这样,你可以用它们做任何你想做的事情,例如:你可以用你的推荐人数据来填充它们。