2015-01-13 2 views
0

Я хочу получить доступ к полям first_name, last_name и email пользователя UserProfile, как если бы они были собственными полями UserProfile.Как создать поле UserProfile, которое является псевдонимом для поля User?

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 

я мог бы использовать независимые имя, фамилию, адрес электронной почты, поля, но это вызвало бы дублирование данных с пользовательскими полями.

обн

Я хочу name, surname и email быть какой-то 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

Мне нравится этот параметр, но я не уверен, будет ли 'имя' присутствовать в редактируемой форме интерфейса администратора, например –

+0

@ СашкоЛихенко. Это не будет редактироваться администратором, если это свойство, но это не то, о чем вы просили. – dylrei

+0

Моя вина. Я хочу указать, что «как если бы они были собственными полями 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

. Каким образом 'type (person.name)' будет ModelField? –

+0

Тип будет или , исходя из возвращаемого значения метода, лежащего в основе свойства. – dylrei

Смежные вопросы