Я хочу получить доступ к полям 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)
самый простой способ разрешить изменения в соответствующий пользователя в контексте личностно-администратора добавить встроенный в Лице ModelAdmin. Это не идеальное решение, но другие решения не просты. См. Https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#inlinemodeladmin-objects – dylrei