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 <[email protected]> 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 [email protected]. > To post to this group, send email to [email protected]. > 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 [email protected]. To post to this group, send email to [email protected]. 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.

