2013-10-28 49 views
0

我有模型是这样的:如何在Django中保存ManyToMany字段?

class GuestStatus(models.Model): 
    guest_status = models.CharField(max_length=200) 
    arrangement = models.IntegerField(unique=True, help_text="Start from 1. Guest status will be arranged alphabetically.") 


class Guest(models.Model): 
    user = models.ForeignKey(User) 
    full_name = models.CharField(max_length=250) 
    status = models.ManyToManyField(GuestStatus, blank=True, null=True) 
    invitation_date = models.DateTimeField(blank=True, null=True) 

我想ManyToManyField被显示为复选框。这就是为什么我在做这样的:

class GuestForm(ModelForm): 
    status = forms.ModelMultipleChoiceField(queryset=GuestStatus.objects.all().order_by('arrangement'), widget=forms.CheckboxSelectMultiple, required=False) 
    class Meta: 
     model = Guest 
     exclude = ['user', 'invitation_date'] 

我试图保存表单是这样的:

form = GuestForm(request.POST) 
    if form.is_valid(): 
     status = form.cleaned_data['status'] 
     guest.status = status 
     if status: 
      invitation_date = datetime.now() 
     else: 
      invitation_date = None 
     new_guest = form.save(commit=False) 

     new_guest.user = request.user 
     new_guest.save() 
     new_guest.status = status 
     form.save_m2m() 

     return HttpResponseRedirect('/list_guests/') 

的形式保存所有的数据,但不能status值。哪里不对?另外,成功保存后,如何访问模板中的状态值?由于

+1

因为你'new_guest.status = status'您保存了'new_guest后' –

+0

如果我在'new_guest.user = request.user'后面写'new_guest.status = status',稍后再'new_guest.save()'我得到这个错误:'“需要有一个值在这个多对多关系可以使用前,可以使用字段“guest” – pynovice

+0

如果表单具有'status'字段,则不需要将其显式设置为'new_guest.status =状态',而不是'form.save_m2m()'。 – Rohan

回答

0

我会做这样的:

form = GuestForm(request.POST) 
if form.is_valid(): 
    if status: 
     invitation_date = datetime.now() 
    else: 
     invitation_date = None 

    new_guest = form.save(commit=False) 
    new_guest.user = request.user 
    new_guest.save() 

    status = form.cleaned_data['status'] 
    for stat in status: 
     new_guest.status_set.create(guest_status = stat['guest_status'], arrangement = stat['arrangement']) 

    return HttpResponseRedirect('/list_guests/') 

后您得到您的new_guest实例创建GuestStatus实例并将其绑定到new_guest

或者,如果GuestStatus是你的字典,您可以:

for stat in status: 
     gs = GuestStatus.objects.get(pk = stat['guest_status']) 
     new_guest.status_set.add(gs) 

希望你了解我和我的英语:)

+0

''客人'的对象没有属性'status_set''错误,同时保存! – pynovice

+0

什么django版本我们使用?https://docs.djangoproject.com/en/1.5/ref/models/relations/ – McAbra