Use the django-extra-views[1]. You can easily manage multiple inline formsets with CreateViews and UpdateViews.
[1] https://github.com/AndrewIngram/django-extra-views On Sat, Jan 10, 2015 at 11:23 AM, Dan Gentry <d...@gentryville.net> wrote: > I would suggest that in the UpdateView you should set the object to the > master record being updated rather than to none for both get() and post(). > > > On Saturday, January 10, 2015 at 8:08:47 AM UTC-5, Ranjith Kumar wrote: >> >> Hello all, >> I have been trying to do Django class-based CreateView and UpdateView >> with multiple inline formsets >> >> CreateView works fine but UpdateView is not working properly, If anyone >> tried UpdateView with multiple inline formsets, please point me right >> approach. >> >> *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, Ingredient, 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, request, *args, **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, ingredient_form, >> instruction_form) >> >> def form_valid(self, form, ingredient_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, form, ingredient_form, instruction_form): >> return self.render_to_response( >> self.get_context_data(form=form, >> ingredient_form=ingredient_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, request, *args, **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, ingredient_form, >> instruction_form) >> >> def form_valid(self, form, ingredient_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, form, ingredient_form, instruction_form): >> return self.render_to_response( >> self.get_context_data(form=form, >> ingredient_form=ingredient_form, >> instruction_form=instruction_form)) >> >> Thanks in advance. >> >> -- >> Cheers, >> Ranjith Kumar K, >> Chennai. >> >> http://ranjithtenz.wordpress.com >> >> >> -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to django-users+unsubscr...@googlegroups.com. > To post to this group, send email to django-users@googlegroups.com. > Visit this group at http://groups.google.com/group/django-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/87615ba0-8c6f-4ebc-8fb5-724441351308%40googlegroups.com > <https://groups.google.com/d/msgid/django-users/87615ba0-8c6f-4ebc-8fb5-724441351308%40googlegroups.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscr...@googlegroups.com. To post to this group, send email to django-users@googlegroups.com. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAGjPPHm9au%2BeHBzcT56avssOKs_icKLJn01braXOJcT7EQbviA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.