热门话题

Php 研究室

一视图多表单的实现    作者:zjxplq发表于2009-05-20 18:58:15

	   

书pro django的学习笔记,下面的例子引用于pro django的第10章
一视图多表单功能在做东西时要用,想了两种替代方案:
1、用两个视图,每个视图各一个表单,一个视图提交后自动重定向到另一个视图,此时用的是HttpResponseRedirect
2、在应用中提交第一个视图时,需要显示一个提交成功的信息,所以又使用session,来传递第二个视图的url
但这两种方案总感觉不好,结果在pro_django书中找到了解决方案。

两个model:
[b]models.py[/b][code]from django.db import models
from django.contrib.auth.models import User
from django.contrib.localflavor.us import models as us_models

from chapter11.history import models as history_models

class Contact(models.Model):
user = models.OneToOneField(User)
phone_number = us_models.PhoneNumberField()
address = models.CharField(max_length=255)
city = models.CharField(max_length=255)
state = us_models.USStateField()
zip_code = models.CharField(max_length=255)[/code]两个forms
[b]forms.py[/b][code]from django import forms
from django.contrib.localflavor.us import forms as us_forms
from django.contrib.auth.models import User

from chapter10.contacts.models import Contact

class UserEditorForm(forms.ModelForm):
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email')

class ContactEditorForm(forms.ModelForm):
phone_number = us_forms.USPhoneNumberField(required=False)
state = us_forms.USStateField(widget=us_forms.USStateSelect, required=False)
zip_code = us_forms.USZipCodeField(label='ZIP Code', required=False)

class Meta:
model = Contact
exclude = ('user',)
[/code]一个视图
[b]views.py[/b][code]from django.shortcuts import render_to_response, get_object_or_404
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

from chapter10.contacts import forms, models

def edit_contact(request, username=None, template_name='contacts/editor_form.html'):
# Set up some default objects if none were defined.
# 如果username不为空,则从User库中获取相关信息,实现了编辑功能
# 如username为空,实现创建功能
if username:
user = get_object_or_404(models.User, username=username)
try:
contact = user.contact
except models.Contact.DoesNotExist:
contact = models.Contact(user=user)
else:
user = models.User()
contact = models.Contact(user=user)

if request.method == 'POST':
user_form = forms.UserEditorForm(request.POST, instance=user)
contact_form = forms.ContactEditorForm(request.POST, instance=contact)
if user_form.is_valid() and contact_form.is_valid():
user = user_form.save()

# 下面这句话相当重要,设置contact的user属性
contact_form.cleaned_data['user'] = user
contact = contact_form.save()
return HttpResponseRedirect(reverse('contact_detail',
kwargs={'slug': user.username}))
else:
user_form = forms.UserEditorForm(instance=user)
contact_form = forms.ContactEditorForm(instance=contact)
return render_to_response(template_name, {
'username': username,
'user_form': user_form,
'contact_form': contact_form,
}, context_instance=RequestContext(request))[/code]

[[i] 本帖最后由 zjxplq 于 2009-5-20 19:09 编辑 [/i]]

charo回复于2009-06-08 20:06:08
学习下~
回复主题
Copyright © 2008-2010 版权所属:中国Python联盟 www.okpython.com
京ICP备08012290号 村长QQ:81356625 E-mail:xieaotian@163.com