Stefan Nitsche wrote:
>
>
> On Thu, Jan 28, 2010 at 10:15, andreas schmid <a.schmi...@gmail.com
> <mailto:a.schmi...@gmail.com>> wrote:
>
>     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>
>     > <mailto: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>>
>     >     > <mailto: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>>
>     >     <mailto: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>>
>     >     <mailto: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>
>     <mailto: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>
>     >     <mailto:django-users%2bunsubscr...@googlegroups.com
>     <mailto:django-users%252bunsubscr...@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>
>     >     <mailto: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>
>     >     <mailto:django-users%2bunsubscr...@googlegroups.com
>     <mailto:django-users%252bunsubscr...@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>
>     <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.
>
>
> Yes my form works for both editing and adding new items (yay!).
>
> How does your template look like? I found this that seems like it
> could be related: http://www.pubbs.net/django/200908/18448/ and it
> talks about looping over hidden form elements.
>
my template looks like this:

                    {% for f in formset.management_form %}
                          {{ f }}
                    {% endfor %}
                    {% for form in formset.forms %}
                        <tr id="{{ form.prefix }}-row" class="setfield">
                            <td class="type {% if form.type.errors
%}error{%endif%}">{{ form.type }}</td>
                            <td class="name {% if form.name.errors
%}error{%endif%}">{{ form.name }}</td>
                            <td class="budget {% if form.budget.errors
%}error{%endif%}">{{ form.budget }}</td>
                        </tr>
                    {% endfor %}

basically because i have to delete and add forms in the formset trough
js with http://www.djangosnippets.org/snippets/1389/ but i will check
about the hidden fields today.

-- 
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