【问题标题】:Django inlineformset does not save ForeignKey fieldDjango inlineformset 不保存 ForeignKey 字段
【发布时间】:2014-07-16 03:31:42
【问题描述】:

所以我正在测试 Django 中的 inlineformset 功能,到目前为止有以下代码:

应用程序名称:示例

models.py

from django.db import models
from django.core.urlresolvers import reverse

class Recipe(models.Model):
    pub_date = models.DateTimeField('Date Published', auto_now_add= True)
    title = models.CharField(max_length=200)
    instruction = models.TextField()

    def __unicode__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('recipe_edit', kwargs={'pk': self.pk})


class Ingredient(models.Model):
    recipe = models.ForeignKey(Recipe, related_name="ingredients")
    ingredient = models.CharField(max_length=255)

    def __unicode__(self):
        return self.recipe_id

    def get_absolute_url(self):
        return reverse('ingredient_edit', kwargs={'pk': self.recipe_id})

forms.py

from django import forms
from models import Recipe, Ingredient
from django.forms.models import inlineformset_factory

MAX_INGREDIENTS = 5

IngredientFormSet = inlineformset_factory(
    Recipe,
    Ingredient,
    can_delete=False,
    extra=MAX_INGREDIENTS
)


class UserSubmittedRecipeForm(forms.ModelForm):
    class Meta:
        model = Recipe
        exclude = ('pub_date',)

views.py

def recipe_create(request, template_name='example/recipe_form.html'):
    if request.POST:
        form = UserSubmittedRecipeForm(request.POST)
        if form.is_valid():
            recipe = form.save(commit=False)
            ingredient_formset = UserSubmittedRecipeForm(request.POST, instance=recipe)
            if ingredient_formset.is_valid():
                recipe.save()
                ingredient_formset.save()
                return redirect('recipe_list')
    else:
        form = UserSubmittedRecipeForm()
        ingredient_formset = IngredientFormSet(instance=Recipe())
    return render(request, template_name, {
        "form": form,
        "ingredient_formset": ingredient_formset
    }, context_instance=RequestContext(request))

查看版本 2 这也不起作用。

def recipe_create(request, template_name='example/recipe_form.html'):
    if request.POST:
        form = UserSubmittedRecipeForm(request.POST)
        if form.is_valid():
            created_recipe = form.save()
            ingredient_formset = UserSubmittedRecipeForm(request.POST, instance=created_recipe)
            if ingredient_formset.is_valid():
                ingredient_formset.save()
                return redirect('recipe_list')
    else:
        form = UserSubmittedRecipeForm()
        recipe = Recipe()
        ingredient_formset = IngredientFormSet(instance=recipe)
    return render(request, template_name, {
        "form": form,
        "ingredient_formset": ingredient_formset
    }, context_instance=RequestContext(request))

我遇到的问题是每次提交表单时都没有保存成分模型中的“成分”字段。

没有显示错误。配方模型中的其余字段已正确保存。

有人知道这是为什么吗?

【问题讨论】:

    标签: python django inline-formset


    【解决方案1】:

    应该
    ingredient_formset = UserSubmittedRecipeForm(request.POST, instance=created_recipe)

    ingredient_formset = IngredientFormSet(request.POST, instance=created_recipe)?

    如果这是问题所在,那么您在两个视图中都遇到了问题。

    【讨论】:

      【解决方案2】:

      第 2 版视图中有错字。检查这是否解决了您的问题

      Views.py 版本 2:

         def recipe_create(request, template_name='example/recipe_form.html'):
          if request.POST:
              form = UserSubmittedRecipeForm(request.POST)
              if form.is_valid():
                  created_recipe = form.save()
                  #There was a typo here
                  ingredient_formset = IngredientFormSet(request.POST, instance=created_recipe)
                  if ingredient_formset.is_valid():
                      ingredient_formset.save()
                      return redirect('recipe_list')
          else:
              form = UserSubmittedRecipeForm()
              recipe = Recipe()
              ingredient_formset = IngredientFormSet(instance=recipe)
          return render(request, template_name, {
              "form": form,
              "ingredient_formset": ingredient_formset
          }, context_instance=RequestContext(request))
      

      【讨论】:

      • 感谢@gmfreak,您的回答也正确,因为 neRok 首先发布了它,所以我必须接受他的回答。
      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 2020-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2020-08-02
      • 2012-07-23
      相关资源
      最近更新 更多