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
Post a Comment