Python Django inlineformset不保存ForeignKey字段

Python Django inlineformset不保存ForeignKey字段,python,django,inline-formset,Python,Django,Inline Formset,因此,我正在Django中测试inlineformset特性,到目前为止,我有以下代码: 应用程序名称:示例 型号.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 =

因此,我正在Django中测试inlineformset特性,到目前为止,我有以下代码:

应用程序名称:示例

型号.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})
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',)
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))
forms.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})
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',)
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))
视图.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})
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',)
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))
我遇到的问题是,并非每次提交表单时都保存配料模型中的“配料”字段

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


有人知道这是为什么吗?

第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))
应该
component\u formset=UserSubmittedRecipeForm(request.POST,instance=created\u recipe)


component\u formset=IngredientFormSet(request.POST,instance=created\u recipe)


如果这是个问题,你在两种观点中都提出了。

谢谢@gmfreak你的答案也正确,因为neRok先发布了它,我不得不接受他的答案。