and your form works on edit too?
i really cant understand why mine isnt...

its giving me this MultiValueDictKeyError which i dont understand.

Stefan Nitsche wrote:
> On Wed, Jan 27, 2010 at 14:04, andreas schmid <a.schmi...@gmail.com
> <mailto:a.schmi...@gmail.com>> wrote:
>
>     is this an add or an edit form? or both?
>
>     i have a similar inlineformset and i need to loop over the inline
>     objects to set the foreignkey to the parent object like:
>
>        if form.is_valid() and formset.is_valid(): # All validation
>     rules pass
>                    new_idea = form.save(commit=False)
>                    new_idea.author = request.user
>                    new_idea = form.save()
>                    formset_models = formset.save(commit=False)
>                    for f in formset_models:
>                        f.idea = new_idea
>                        f.save()
>                    return
>     HttpResponseRedirect(new_idea.get_absolute_url())
>
>
>     im actually experiencing problems with the edit form where i can
>     get the
>     values displayed in the form if i want to edit but i get a
>
>        Exception Type:     MultiValueDictKeyError
>        Exception Value:
>
>        Key 'activity_set-0-id' not found in <QueryDict:
>     {u'activity_set-0-name': [u'a\xf6lskjdf\xf6sa'],
>     u'activity_set-0-type': [u'research']
>
>     on save... any hints?
>
>
>     Stefan Nitsche wrote:
>     > On Mon, Jan 4, 2010 at 23:27, Stefan Nitsche <ste...@nitsche.se
>     <mailto:ste...@nitsche.se>
>     > <mailto:ste...@nitsche.se <mailto:ste...@nitsche.se>>> wrote:
>     >
>     >     Hi,
>     >
>     >     to begin with I would like to declare that I'm still on the
>     >     beginner end of the scale when it comes to Python and Django.
>     >
>     >     I have an app which has two models:
>     >
>     >     class Item(models.Model):
>     >         title = models.CharField()
>     >         description_markdown = models.TextField()
>     >
>     >     class ItemImage(models.Model):
>     >         item = models.ForeignKey(Item)
>     >         image = models.ImageField(upload_to='tmp')
>     >
>     >     What I want to do now is to create a page where users can submit
>     >     an item and upload an image (or images) at the same time. I can
>     >     create a form using ModelForm for the Item-model and I can
>     create
>     >     a form for the ItemImage-model using inlineformset_factory, if I
>     >     do this the submit page looks like it should. However it doesn't
>     >     behave the way I want it to when saving, but to be honest I have
>     >     no real idea of what I'm doing when it comes to the related
>     >     model/form.
>     >
>     >     If I understand it correctly when using inlineformset_factory I
>     >     must give it an instance so that it can map the foreignkey,
>     >     correct? So how do one go about and create a form where
>     people can
>     >     add "item" and "itemimages" at the same time? I'm feeling totaly
>     >     lost any pointers would be greatly appreciated.
>     >
>     >     --
>     >     Stefan Nitsche
>     >     ste...@nitsche.se <mailto:ste...@nitsche.se>
>     <mailto:ste...@nitsche.se <mailto:ste...@nitsche.se>>
>     >
>     >
>     >
>     > Ok I'm totally lost here. I've created an edit function which works
>     > splendidly except for the inline-part, it displays alright but it
>     > isn't saved at all.
>     >
>     > My models look like this:
>     > ==================
>     >
>     > class Recipe(models.Model):
>     >     author = models.ForeignKey(User)
>     >     name = models.CharField(max_length=255, verbose_name='Namn
>     på rätten')
>     >     category = models.ForeignKey('Category',
>     verbose_name='Kategori')
>     >     create_date = models.DateTimeField(auto_now_add=True)
>     >     servings = models.CharField(max_length=10,
>     verbose_name='Portioner')
>     >     cooking_time = models.CharField(max_length=10,
>     > verbose_name='Tillagningstid')
>     >     ingredients = models.TextField(verbose_name='Ingridienser')
>     >     instructions = models.TextField(verbose_name='Instruktioner')
>     >     oven_heat = models.CharField(max_length=10, null=True,
>     blank=True,
>     > verbose_name='Ugnsvärme')
>     >     serving_tips = models.TextField(null=True, blank=True,
>     > verbose_name='Serveringsförslag')
>     >     tags = TagField(verbose_name='Taggar')
>     >     slug = models.SlugField()
>     >     published = models.NullBooleanField(default=1)
>     >
>     > class Image(models.Model):
>     >     recipe = models.ForeignKey(Recipe)
>     >     file = models.ImageField(upload_to=get_file_path)
>     >
>     > My view looks like this:
>     > =================
>     > from django.shortcuts import render_to_response, get_object_or_404
>     > from django.template import RequestContext
>     > from django.http import HttpResponseRedirect
>     > from nitsche.recipes.models import Category, Recipe, Image
>     > from nitsche.recipes.forms import RecipeForm
>     > from django.contrib.auth.decorators import login_required
>     > from django.forms.models import inlineformset_factory
>     >
>     > @login_required
>     > def edit(request, slug):
>     >     ImageFormSet = inlineformset_factory(Recipe, Image)
>     >     recipe = Recipe.objects.filter(published=True).get(slug=slug)
>     >     form = RecipeForm(instance=recipe)
>     >     formset = ImageFormSet(instance=recipe)
>     >     if request.method == 'POST':
>     >         form = RecipeForm(request.POST, instance=recipe)
>     >         formset = ImageFormSet(request.POST, request.FILES,
>     > instance=recipe)
>     >         if form.is_valid(): # All validation rules pass
>     >             form.save()
>     >         if formset.is_valid():
>     >             formset.save()
>     >         return HttpResponseRedirect('/recept')
>     >     return render_to_response('recipes/add.html',
>     >                               {'form': form, 'formset': formset,
>     > 'slug':slug,},
>     >                              
>     context_instance=RequestContext(request))
>     >
>     > And finaly my template looks like this:
>     > ============================
>     >
>     > <form action="/recept/edit/{{ slug }}/" method="POST">
>     > {{ form.as_p }}
>     > <table>
>     > {{ formset }}
>     > </table>
>     > <input type="submit" value="Submit" />
>     > </form>
>     >
>     > Every change I make in the main form (for the recipe-model) is saved
>     > but nothing from the inline_formset (the image-model). I get no
>     error
>     > or anything, it behaves as if it is saving all the data but in the
>     > reality nothing in the inline_formset is saved. I've read the
>     > documentation and as far as I understand it should work this
>     way. When
>     > I add or edit an item in the backend it works as it should. Can
>     > somebody point out what I'm doing wrong? At this point I am starting
>     > to feel a little desperate and any nudge in the right direction
>     would
>     > be greatly appreciated.
>     >
>     > --
>     > Stefan Nitsche
>     > ste...@nitsche.se <mailto:ste...@nitsche.se>
>     <mailto:ste...@nitsche.se <mailto:ste...@nitsche.se>>
>     > --
>     > You received this message because you are subscribed to the Google
>     > Groups "Django users" group.
>     > To post to this group, send email to
>     django-users@googlegroups.com <mailto:django-users@googlegroups.com>.
>     > To unsubscribe from this group, send email to
>     > django-users+unsubscr...@googlegroups.com
>     <mailto:django-users%2bunsubscr...@googlegroups.com>.
>     > For more options, visit this group at
>     > http://groups.google.com/group/django-users?hl=en.
>
>     --
>     You received this message because you are subscribed to the Google
>     Groups "Django users" group.
>     To post to this group, send email to django-users@googlegroups.com
>     <mailto:django-users@googlegroups.com>.
>     To unsubscribe from this group, send email to
>     django-users+unsubscr...@googlegroups.com
>     <mailto:django-users%2bunsubscr...@googlegroups.com>.
>     For more options, visit this group at
>     http://groups.google.com/group/django-users?hl=en.
>
>
> I can understand your confusion since in my first post I was trying to
> create an add form and in my second email I changed it to be an edit
> form (since I figured it would be easier to get going).
>
> I've actually solved my problem now. First: thanks to you I got on the
> right track. Second: I'm stupid.
>
> After I had changed the save function to mimic yours and it still
> didn't work I started to print every variable I could find. After some
> trials and more prints I discovered that request.FILES was empty.
> Adding enctype="multipart/form-data" to the form in the template
> solved that embarrassingly stupid error.
>
> I am now able to add and edit items from the frontend. Here is how my
> view-function and my template looks like (for now):
>
> views.py
> ======
> def edit(request, category=None, slug=None):
>     ImageFormSet = inlineformset_factory(Recipe, Image)
>     if slug is not None:
>         recipe = Recipe.objects.filter(published=True).get(slug=slug)
>         form = RecipeForm(instance=recipe) # A bound form
>         formset = ImageFormSet(instance=recipe)            
>     else:
>         form = RecipeForm() # An unbound form
>         formset = ImageFormSet(instance=None)
>     if request.method == 'POST': # If the form has been submitted...
>         if slug is not None:
>             form = RecipeForm(request.POST, instance=recipe) # A form
> bound to the POST data
>             formset = ImageFormSet(request.POST, request.FILES,
> instance=recipe) # An inline formset bound to the POST and FILES data
>         else:
>             form = RecipeForm(request.POST, instance=None) # A form
> bound to the POST data
>             formset = ImageFormSet(request.POST, request.FILES,
> instance=None) # An inline formset bound to the POST and FILES data
>         if form.is_valid() and formset.is_valid(): # All validation
> rules pass
>            new_recipe = form.save(commit=False)
>            new_recipe = form.save()
>            if slug is None:
>                formset = ImageFormSet(request.POST, request.FILES,
> instance=new_recipe) # An inline formset bound to the POST and FILES data
>            formset_models = formset.save(commit=False)
>            for f in formset_models:
>                f.recipe = new_recipe 
>                f.save()
>            #return HttpResponseRedirect(reverse('recipes-index',)) #
> Redirect after POST
>            return HttpResponseRedirect(new_recipe.get_absolute_url())
>     return render_to_response('recipes/edit.html',
>                               {'form': form, 'formset': formset,
> 'slug':slug, 'category':category,},
>                               context_instance=RequestContext(request))
>
> edit.html
> ======
> <form action="{% if slug %}{% url recipes-edit category slug %}{% else
> %}{% url recipes-add %}{% endif %}" method="POST"
> enctype="multipart/form-data">
> {{ form.as_p }}
>
> <h2>Ladda upp bild(er)</h2>
> <table>
> {{ formset }}
> </table>
> <input type="submit" value="Submit" />
> </form>
>
> -- 
> Stefan Nitsche
> ste...@nitsche.se <mailto:ste...@nitsche.se>
> -- 
> You received this message because you are subscribed to the Google
> Groups "Django users" group.
> To post to this group, send email to django-us...@googlegroups.com.
> To unsubscribe from this group, send email to
> django-users+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to