On Sat, Jan 30, 2010 at 11:23, andreas schmid <a.schmi...@gmail.com> wrote:

> 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<django-users%2bunsubscr...@googlegroups.com>
> >     
> > <mailto:django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
> >
> >     >     
> > <mailto:django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
> >     
> > <mailto:django-users%252bunsubscr...@googlegroups.com<django-users%25252bunsubscr...@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<django-users%2bunsubscr...@googlegroups.com>
> >     
> > <mailto:django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
> >
> >     >     
> > <mailto:django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@googlegroups.com>
> >     
> > <mailto:django-users%252bunsubscr...@googlegroups.com<django-users%25252bunsubscr...@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<django-users%2bunsubscr...@googlegroups.com>
> >     
> > <mailto:django-users%2bunsubscr...@googlegroups.com<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>.
> >     To unsubscribe from this group, send email to
> >     
> > django-users+unsubscr...@googlegroups.com<django-users%2bunsubscr...@googlegroups.com>
> >     
> > <mailto:django-users%2bunsubscr...@googlegroups.com<django-users%252bunsubscr...@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<django-users%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/django-users?hl=en.
>
>
I looked into that a little more and I don't think you need to loop over
hidden elements like the link suggested if you are using Django 1.1 (it
seems to have changed). You will however need to add a {{ form.id }} into
your for-loop. (This can be found in the documentation
http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#using-the-formset-in-the-template)
form.id should create the missing "activity_set-0-id" :)

-- 
Stefan Nitsche
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.

Reply via email to