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.

Reply via email to