How to embed a model's form in another model in Django? -


updated using basti's answer view

i have model phones (phonemixin - use other model) , person:

from django.utils.translation import ugettext_lazy _ django.db import models  class phonemixin(models.model):     types_choices = (         ('home', u'home'),         ('work', u'work'),         ('mobile', u'mobile'),         ('home_fax', u'fax (home)'),         ('work_fax', u'fax (work)'),         ('pager', u'pager'),         ('other', u'other')     )     phone_type = models.charfield(_('type'), max_length=20, choices=types_choices)     number = models.charfield(_('number'), max_length=40)     comment = models.textfield(_('comment'), blank=true, null=true)  class person(models.model):     class meta:         verbose_name = u'person'         verbose_name_plural = u'people'      name = models.charfield(max_length=255, verbose_name=u'name')     email = models.emailfield(max_length=75)      def __unicode__(self):         return self.name  class phoneperson(phonemixin):     belongs_to = models.foreignkey(person) 

i have forms:

from django import forms models import person, phonemixin  class personform(forms.modelform):     class meta:         model = person  class phoneform(forms.modelform):     class meta:         model = phonemixin 

and view is:

from django.forms.formsets import formset_factory django.http import httpresponseredirect django.shortcuts import render forms import phoneform, personform   def person_insert_view(request):     phoneformset = formset_factory(phoneform)      if request.method == 'post':  # if form has been submitted...         phone_formset = phoneformset(request.post, prefix='phone_formset')         person_form = personform(request.post, prefix='person_form')         if person_form.is_valid():  # validation rules pass             person = form.save(commit=false)             phone_formset = phoneformset(request.post, instance=person)             if phone_formset.is_valid():                 phone_formset.save()                 person.save()             return httpresponseredirect('/')  # redirect after post         else:             return render_to_response('function_based_person.html',{         'person_form': person_form,         'phone_formset': phone_formset,     })     else:         person_form = personform()         phone_formset = phoneformset(prefix='phone_formset')      return render(request, 'function_based_person.html', {         'person_form': person_form,         'phone_formset': phone_formset,     }) 

and function_based_person.html template:

<html> <body> <form enctype="multipart/form-data" method="post" action="."> {% csrf_token %} {% if person_form.visible_fields %}     {% field in person_form.visible_fields %}     <div class="control-group{% if field.errors %} error{% endif %}">         <label class="control-label" for="id_{{ field.html_name }}">{{ field.label }}    </label>         <div class="controls">             {{ field }}             {% if field.errors %}             <span class="help-inline">{% error in field.errors %}{{ error }}{% endfor %}</span>             {% endif %}             {% if field.help_text %}<span class="help-inline">{{ field.help_text }}</span>{% endif %}         </div>     </div>     {% endfor %}      {% phone_form in phone_formset %}       {{phone_form.as_table}}     {% endfor %}     <div class="form-actions">         <button type="submit" class="btn btn-primary">save</button>     </div> {% endif %}  </form> </body> </html> 

the problem want have @ least 1 phone in person, , have possibility have 2 or more, user wants add it.

a foreignkey pointer specific row in table. person model says "every person has 1 or 2 telephones. each telephone stored in table called 'phone'." so, unless doing sophisticated, person form asking associate 2 existing phones new person.

(editing respond comment).
if want have multiple phones, need formset

the first thing need change table points @ which: instead of person pointing phone, phone should point person. so, example, add belongs_to = models.foreignkey(person) phone model declaration.

the next step ask phones in view. here formsets come in. in views, create formset:

#in views.py django.forms.formsets import formset_factory phoneformset = formset_factory(phoneform, extras = 1)  if request.method == 'post':     phone_formset = phoneformset(request.post, prefix = 'phone_formset')     person_form = personform(request.post, prefix='person_form')     # validate forms, etc else:     person_form = personform()     phone_formset = phoneformset(prefix = 'phone_formset') 

add phone_formset dictionary passed template, end render so:

# in template <form> {{person_form.as_p}} {% phone_form in phone_formset %}   {{phone_form.as_table}} {% endfor %} </form> 

the last thing need set each phone's belongs_to field person submitted form. have in view: maybe save person before saving phones, pk, set phone's foreign key , save it.


Comments