Search code examples
djangoformsviewmodels

Creating multiple objects using the same form


Hi I have just read through, http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/, and am trying to apply it to my own django app.

I have created a view which lets me use a single form to create and store 2 objects that are related to each other

I am getting a post error but can't seem to find what is causing it.

After clicking add a blank white page is shown along with the error message below, which is in red in the terminal.

'[28/May/2014 02:57:25] "POST /members HTTP/1.1" 405 0'

Models

class MemberRole(models.Model,get_fields):
    name = models.CharField(max_length = 20)

    def __unicode__(self): 
        return self.name

class Member(models.Model,get_fields):
    first_name = models.CharField(max_length = 20)
    role = models.ForeignKey(MemberRole, null = True, blank = True)

Forms

class MemberForm(forms.ModelForm):
    class Meta:
        model = Member
        exclude = ('role',)

class MemberRoleForm(forms.ModelForm):
    class Meta:
        model = MemberRole

View fucntion

def add_member(request):

model_url = 'member-list'

if request.method == "POST":
    rform = MemberRoleForm(request.POST, instance=MemberRole())
    mform = MemberForm(request.POST, instance=Member())
    if rform.is_valid() and mform.is_valid():
        new_role = rform.save()
        new_member = mform.save()
        return HttpResponseRedirect('member-list')
else:
    rform = MemberRoleForm(instance=MemberRole())
    mform = MemberForm(instance=Member())
return render_to_response('create_model.html', {'role_form': rform, 'member_form': mform, 'model_url': model_url,},context_instance=RequestContext(request))

snippet of create_model.html

<form action="{% url model_url %}" method="POST">
  {% csrf_token %}

  {% if model_url == 'member-list' %}

    {% for field in member_form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
    {% endfor %}
    {% for field in role_form %}
    <div class="fieldWrapper">
        {{ field.errors }}
        {{ field.label_tag }} {{ field }}
    </div>
    {% endfor %}

  {% endif %}
     <input id="save_contact" type="submit" value="Add"/>
</form>

Solution

  • I've solved it, it was due to some errors in url naming

    View

    model_url = 'member-add'
    return HttpResponseRedirect('members')
    

    URLS

    url(r'^members', ModelListView.as_view(model = Member,page_name = 'Members',edit_link = 'updatemember/'), name='member-list'),
    url(r'^addmember', 'inventory.views.add_member', name = 'member-add'),