Я расширил стандартную модель пользователя Django с помощью UserProfile и создал отношение OneToOne из UserProfile к пользователю, например:
class UserProfile(models.Model):
user = models.OneToOneField(adminmodels.User)
about = models.TextField('About the author', blank=True)
picture = models.ImageField('Picture (70px x 70px)', blank=True, upload_to='uploads/profile_pics', default='noone.png')
user_site = models.URLField(blank=True, verify_exists=False)
class Meta:
verbose_name = "Profiel"
verbose_name_plural = "Profielen"
Чтобы получить соответствующую форму администратора, включенную в администратор пользователя, я создал встроенную форму администратора и добавил ее к администратору пользователя, например:
# Inline admin for the user profile
class UserProfileInline(admin.StackedInline):
model = UserProfile
fk_name = 'user'
max_num = 1
extra = 0
# Include the extra form
class MyUserAdmin(admin.ModelAdmin):
inlines = [UserProfileInline, ]
# Re-register the user form
admin.site.unregister(admin.models.User)
admin.site.register(admin.models.User, MyUserAdmin)
Чем, наконец, чтобы сохранить экземпляр UserProfile, у меня есть функция, связанная с postsave. Это выглядит так:
def on_user_was_saved(sender,instance,created,using,*args,**kwargs):
if type(instance) == adminmodels.User:
if created:
profile = UserProfile.objects.get_or_create(user = instance)
profile.save()
else:
profile = UserProfile.objects.get_or_create(user = instance)
profile[0].save()
Теперь две вещи идут не так, как надо:
- При сохранении пользователя с чем-либо в поле профиля пользователя, пользователь сохраняется, как и экземпляр UserProfile, но экземпляр сохраняется, как если бы все поля были пустыми. Когда вы вводите что-то новое в эти поля, вы можете сохранить это, но ничто не идет не так, как надо.
- Второй экземпляр формы UserProfile становится доступным; max_num игнорируется.
После ввода benjaoming я изменил свой обратный вызов post_save на:
try:
profile = UserProfile.objects.get(user = instance)
profile.save()
except:
profile = UserProfile.objects.get_or_create(user = instance)
profile[0].save()
Однако это не решает ни одну из проблем, которые у меня уже были.