2015-01-13 53 views
0

我想從UserProfile中訪問用戶模型的first_name,last_name和email字段,就好像它們是UserProfile自己的字段。如何創建用戶字段別名的UserProfile字段?

class Person(models.Model): 
    user = models.OneToOneField(User) 
    name = #ModelField which refers to user.first_name 
    surname = #ModelField which refers to user.last_name 
    email = #ModelField which refers to user.email 
    birth_date = models.DateField(null=True, blank=True) 
    #and other fields 

我可以使用獨立的名稱,姓氏,電子郵件,字段,但它會導致與用戶字段的數據重複。

UPD

namesurnameemail是某種Field類型(birth_date)和這些字段的修改相應的用戶字段(如下所示屬性的行爲)的相等的修飾。我需要這個,因爲我希望這三個字段可以在管理界面中使用,或者與ModelForm中的「本地」字段同等地進行加工。

upd解決方案。不是很花哨,但在這裏它是如何工作對我來說:

class Person(models.Model): 
    user = models.OneToOneField(User) 
    #and also some char, text fields 

    @property 
    def name(self): 
     return self.user.first_name 
    @name.setter 
    def name(self, value): 
     self.user.first_name = value 

    #and by analogy surname and email properties 


class PersonForm(ModelForm): 
    class Meta: 
     model = Person 
     exclude = ('user',) 

    name = forms.CharField(max_length=100, required=False) 
    surname = forms.CharField(max_length=100, required=False) 
    email = forms.EmailField(required=False) 

    #no make fields filled with User data on form load 
    def __init__(self, *args, **kwargs): 
    if 'instance' in kwargs: 
     instance = kwargs['instance'] 
     initial = kwargs.get('initial', {}) 
     initial['name'] = instance.name 
     initial['surname'] = instance.surname 
     initial['email'] = instance.email 
     kwargs['initial'] = initial 
    super(PersonForm, self).__init__(*args, **kwargs) 

    # to save form data to User model when commit 
    def save(self, commit=True): 
     instance = super(PersonForm, self).save(commit) 
     user = instance.user 
     user.first_name = self.cleaned_data['name'] 
     user.last_name = self.cleaned_data['surname'] 
     user.email = self.cleaned_data['email'] 
     user.save() 
     return instance 

class PersonAdmin(admin.ModelAdmin): 
    fields = ['name', 'surname', 'email', 'and_others'] 

    form = PersonForm 

admin.site.register(Person, PersonAdmin) 
+1

允許改變一個人管理的背景下,相關的用戶非常簡單的方式是內嵌添加到人的ModelAdmin。這不是一個完美的解決方案,但其他解決方案並不簡單。請參閱:https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#inlinemodeladmin-objects – dylrei

回答

1

如果要你想要的是訪問user.first_name,user.last_name等..直接作爲人的屬性,你可以添加一個姓名,等等屬性Person模型,而不是字段:

class Person(models.Model): 
    user = models.OneToOneField(User) 
    birth_date = models.DateField(null=True, blank=True) 
    #and other fields 

    @property 
    def name(self): 
     return self.user.first_name 

    @property 
    def surname(self): 
     return self.user.last_name 
    .... 
+0

我喜歡這個選項,但我不確定'name'是否會出現在管理界面的編輯形式中,例如 –

+0

@СашкоЛихенко如果它是一個屬性,它將不會在管理員中被修改,但這不是您要求的。 – dylrei

+0

我的錯。如果要通過管理站點編輯該信息,我需要重新定義相應的ModelAdmin使用的「表單」,爲該數據添加表單字段,以指定「如果它們是UserProfile自己的字段」(如果它們是UserProfile的自己的字段)「 –

1
class Person(models.Model): 
    user = models.OneToOneField(User) 
    @property 
    def name(self): 
     return self.user.first_name 
    @property 
    def surname(self): 
     return self.user.last_name 
+0

類型(person.name)是否應該是ModelField? –

+0

根據屬性所屬方法的返回值,類型將爲。 – dylrei

相關問題