【问题标题】:How to save ManyToMany field in Django?如何在 Django 中保存 ManyToMany 字段?
【发布时间】:2013-10-28 07:06:46
【问题描述】:

我有这样的模型:

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 值。怎么了?另外,成功保存后如何访问模板中的状态值?谢谢

【问题讨论】:

  • 因为你在保存new_guest之后有new_guest.status = status
  • 如果我在new_guest.user = request.user 之后写new_guest.status=status 然后new_guest.save() 我得到这个错误:<Guest: guesteeu>" needs to have a value for field "guest" before this many-to-many relationship can be used
  • 如果表单有status字段,则不需要显式设置为new_guest.status=status,只需设置form.save_m2m()即可。
  • 确实。还是不行:(

标签: django django-orm


【解决方案1】:

我会这样做:

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)

希望你能理解我和我的英语:)

【讨论】:

猜你喜欢
  • 2012-03-08
  • 2018-12-07
  • 2017-10-18
  • 2011-09-06
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2019-02-15
相关资源
最近更新 更多