【发布时间】:2011-04-08 08:29:08
【问题描述】:
我在我的应用程序中使用django-profiles,因为它为我提供了一些简单的视图,可以帮助我更快地到达我想去的地方。
但是,我有一个问题。鉴于以下模型,我如何创建一个表单来编辑包含UserProfile 上的所有字段、User 中的 first_name、last_name 和电子邮件字段以及一个或多个 PhoneNumbers 上的所有字段?
from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
class UserProfile(models.Model):
user = models.OneToOneField(User)
height = models.IntegerField(_('Height'), max_length=3, blank=True, null=True, help_text=_('Users height in centimeters'))
def get_absolute_url(self):
return ('profiles_profile_detail', (), { 'username': self.user.username })
get_absolute_url = models.permalink(get_absolute_url)
def __unicode__(self):
return self.user.username
class PhoneNumber(models.Model):
description = models.CharField(_("Description"), max_length=32, blank=True)
number = models.CharField(_("Phone number"), max_length=15)
owner = models.ForeignKey(UserProfile, related_name="phone_numbers")
def __unicode__(self):
return u"%s (%s)" % (self.number, self.description)
到目前为止,我管理的最接近的表单是包含UserProfile 上的所有字段以及来自User 的所需字段,使用here 和here 解释的技巧:
from django import forms
from main.models import UserProfile
from django.contrib.auth.models import User
class UserForm(forms.ModelForm):
class Meta:
model = User
fields = ('first_name', 'last_name', 'email')
class ProfileForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
# magic
self.user = kwargs['instance'].user
user_kwargs = kwargs.copy()
user_kwargs['instance'] = self.user
self.uf = UserForm(*args, **user_kwargs)
# magic end
super(ProfileForm, self).__init__(*args, **kwargs)
self.fields.update(self.uf.fields)
self.initial.update(self.uf.initial)
def save(self, *args, **kwargs):
# save both forms
self.uf.save(*args, **kwargs)
return super(ProfileForm, self).save(*args, **kwargs)
class Meta:
model = UserProfile
exclude = ("user",)
在管理员中,在自定义 ModelAdmin 上使用内联,我得到了我想要的 PhoneNumbers 的行为,但我无法以单一形式重新创建它以与 django-profiles 一起使用。
这完全有可能吗,还是我应该放弃 django-profiles 并编写自己的配置文件应用程序,该应用程序可以使用表单集来拉入 PhoneNumbers?
【问题讨论】:
标签: python django django-forms