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.