我一直在尝试使用多个内联表单来执行基于Django类的CreateView和UpdateView
CreateView工作正常,但UpdateView无法正常工作,如果任何人尝试使用多个内联表单的UpdateView,任何人都尝试过共享更新视图代码段.
# models.py from django.db import models class Recipe(models.Model): title = models.CharField(max_length=255) description = models.TextField() class Ingredient(models.Model): recipe = models.ForeignKey(Recipe) description = models.CharField(max_length=255) class Instruction(models.Model): recipe = models.ForeignKey(Recipe) number = models.PositiveSmallIntegerField() description = models.TextField() # forms.py from django.forms import ModelForm from django.forms.models import inlineformset_factory from .models import Recipe,Ingredient,Instruction class RecipeForm(ModelForm): class Meta: model = Recipe IngredientFormSet = inlineformset_factory(Recipe,extra=0) InstructionFormSet = inlineformset_factory(Recipe,Instruction,extra=0) # views.py from django.http import HttpResponseRedirect from django.views.generic.edit import CreateView,UpdateView from django.shortcuts import get_object_or_404 from .forms import IngredientFormSet,InstructionFormSet,RecipeForm from .models import Recipe class RecipeCreateView(CreateView): template_name = 'recipe_add.html' model = Recipe form_class = RecipeForm success_url = '/account/dashboard/' def get(self,request,*args,**kwargs): self.object = None form_class = self.get_form_class() form = self.get_form(form_class) ingredient_form = IngredientFormSet() instruction_form = InstructionFormSet() return self.render_to_response( self.get_context_data(form=form,ingredient_form=ingredient_form,instruction_form=instruction_form)) def post(self,**kwargs): self.object = None form_class = self.get_form_class() form = self.get_form(form_class) ingredient_form = IngredientFormSet(self.request.POST) instruction_form = InstructionFormSet(self.request.POST) if (form.is_valid() and ingredient_form.is_valid() and instruction_form.is_valid()): return self.form_valid(form,ingredient_form,instruction_form) else: return self.form_invalid(form,instruction_form) def form_valid(self,form,instruction_form): self.object = form.save() ingredient_form.instance = self.object ingredient_form.save() instruction_form.instance = self.object instruction_form.save() return HttpResponseRedirect(self.get_success_url()) def form_invalid(self,instruction_form): return self.render_to_response( self.get_context_data(form=form,instruction_form=instruction_form)) class RecipeUpdateView(UpdateView): template_name = 'recipe_add.html' model = Recipe form_class = RecipeForm def get_success_url(self): self.success_url = '/account/dashboard/' return self.success_url def get_context_data(self,**kwargs): context = super(RecipeUpdateView,self).get_context_data(**kwargs) if self.request.POST: context['form'] = RecipeForm(self.request.POST,instance=self.object) context['ingredient_form'] = IngredientFormSet(self.request.POST,instance=self.object) context['instruction_form'] = InstructionFormSet(self.request.POST,instance=self.object) else: context['form'] = RecipeForm(instance=self.object) context['ingredient_form'] = IngredientFormSet(instance=self.object) context['instruction_form'] = InstructionFormSet(instance=self.object) return context def post(self,instruction_form=instruction_form))
提前致谢.
解决方法
我的猜测是你不能做
self.object = None
在UpdateView中覆盖的post方法.所以,尝试
self.object = self.get_object()
相反,一旦你在这种情况下已经有一个对象实例.