2010-09-05 47 views
2

我在我的应用中使用django-profiles,因为它给了我几个简单的视图,可以帮助我更快地找到我想要的位置。使用django-profiles编辑配置文件表单中的相关模型

但是,我有一个问题。在给定以下模型的情况下,如何创建表单以编辑包含UserProfile上的所有字段,User的first_name,last_name和email字段以及一个或多个PhoneNumber

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) 

到目前为止,我已经成功最接近的,是包括从User通缉领域上UserProfile各个领域,并使用技巧解释herehere形式:

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上使用Inlines,我得到了我想要的PhoneNumber的行为,但是我还没有能够以单一形式重新创建它,以便与django-profiles一起使用。

是否有可能,或者我应该沟通django-profiles并编写我自己的profile-应用程序,它可以使用formset来拉动PhoneNumber

回答

1

这是相当扭曲将两个模型形式填充到相同的形式。选择:

  • 请发表您的看法。您可以利用django网址的短路,先到先得的性质来盗用该网站。

  • 将django配置文件放入您自己的版本控制中,并将其切入您的心脏内容,而不受可重用性的限制。

  • 您可以使用自己的保存方法创建一个大表格,并使用django-profiles。这比仅仅声明fields = ('first_name', 'last_name', 'email')exclude = ("user",)更繁琐。 See the docstrings

取决于项目。我肯定会试图写我自己的。对于配置文件应用程序来说没有太多的东西,并且您可能会遇到希望获得更多控制权的其他地方。

1

就我所知,django-profiles绝对不过是一套美化的视图。我添加到我的应用程序,但遇到了同样的问题。对源代码的检查表明它基本上没有特征。基本上,它可以节省您编写自己的edit_profilecreate_profile视图的麻烦。真的,就是这样。除非你对编写自己的看法有严重的恐惧,否则不要打扰使用django-profiles,只是推出自己的代码。