2010-09-05 45 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,只是推出自己的代碼。