【问题标题】:Django: ModelMultipleChoiceField won't save dataDjango:ModelMultipleChoiceField 不会保存数据
【发布时间】:2011-06-08 17:59:20
【问题描述】:

我的模型表单有一个带有 ModelMultipleChoiceField 的字段,该字段有一个 Category 对象的查询集。问题是表单提交,但类别数据没有保存。想法?

非常感谢!

表格:

class MealForm(forms.ModelForm):
  class Meta:
    model = Meal
    fields = ('category','date','time')

  category = forms.ModelMultipleChoiceField(
        label=_("Food style"),
        queryset=Category.objects.all(),
                                  required=True)

查看

@login_required
def new_meal(request, template_name="meal/newmeal.html"):

  if request.method == 'POST':
    form = MealForm(request.POST)
    form.mom = request.user
    if form.is_valid():
      meal = form.save(commit=False)
      meal.mom = request.user
      meal.save()
      return HttpResponseRedirect('/meal/%d' % meal.id )
  else:
    form = MealForm()

  data = {
    'form': form,
    'add': True
  }

型号:

class Category(models.Model):

  name = models.CharField(default='',max_length=100)
  num_tags = models.IntegerField(default=0)

  def __unicode__(self):
          return "%s" % self.name
  class Meta:
    ordering = ['name']

class Meal(models.Model):
  category = models.ManyToManyField(Category)

【问题讨论】:

    标签: django forms manytomanyfield django-forms


    【解决方案1】:

    当您在ModelForm 上执行commit=False 时,您需要使用mymodelform.save_m2m(),因为没有ID(又名save(commit=True))就无法保存m2m 关系。

    如果没有先保存父模型,则中间表 (m2m) 没有可引用的 ID!

    http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method

    @login_required
    def new_meal(request, template_name="meal/newmeal.html"):
    
      if request.method == 'POST':
        form = MealForm(request.POST)
        form.mom = request.user
        if form.is_valid():
          meal = form.save(commit=False)
          meal.mom = request.user
          meal.save()
          form.save_m2m() # save m2m after meal has id
    
          return HttpResponseRedirect('/meal/%d' % meal.id )
      else:
        form = MealForm()
    
      data = {
        'form': form,
        'add': True
      }
    

    【讨论】:

    • 啊,谢谢..分类是我不小心复制进去的错误。已删除。
    • 啊,那么我会更新我的答案.. 这是因为您正在执行 commit=False 并且 m2m 无法在没有模型 ID 的情况下保存
    • 困扰了我好几个小时!而且绝对没有错误信息(或警告)...
    • @ThePhi 很高兴这个 6 岁的帖子有帮助!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多