Встроенный администратор игнорирует max_num и дополнительные, если экземпляр существует - PullRequest
0 голосов
/ 25 сентября 2011

Я расширил стандартную модель пользователя 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()

Теперь две вещи идут не так, как надо:

  1. При сохранении пользователя с чем-либо в поле профиля пользователя, пользователь сохраняется, как и экземпляр UserProfile, но экземпляр сохраняется, как если бы все поля были пустыми. Когда вы вводите что-то новое в эти поля, вы можете сохранить это, но ничто не идет не так, как надо.
  2. Второй экземпляр формы 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()

Однако это не решает ни одну из проблем, которые у меня уже были.

1 Ответ

1 голос
/ 25 сентября 2011

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

Кроме того, admin.StackedInline не создан для той цели, для которой вы пытаетесь его использовать. Это управляет отношениями «один ко многим», а не отношениями «один к одному».

Если вы должны обладать функциями администратора, следуйте в точности настройкам, которые вы обрисовали, вероятно, вам лучше всего добавить пользовательское представление к AdminSite с формами для добавления и редактирования пользователей. Кроме того, попросите людей отредактировать две формы для создания пользователя.

В любом случае, вы можете прочитать больше о добавлении просмотров к AdminSite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...