我想從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
欲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