Django Interleaving UserProfile с профилем в Admin

У меня есть профиль пользователя, который в настоящее время отображается в панели администратора через Stacked Inline. Однако, поскольку у меня есть такие поля, как last_name_prefix и last_name_suffix (для иностранных имен, таких как Piet van Dijk, для правильной сортировки по фамилии), я хотел бы иметь возможность чередовать поля профиля пользователя с обычными полями изменения пользователя. Таким образом, в административном интерфейсе смены пользователя это будет выглядеть так:

Имя:
Префикс фамилии:
Фамилия
Суффикс фамилии:

Я пробовал это решение: http://groups.google.com/group/django-users/browse_thread/thread/bf7f2a0576e4afd1/5e3c1e98c0c2a5b1. Но это просто создало дополнительные поля в пользовательской форме, которые на самом деле не исходили из профиля пользователя (они оставались пустыми, даже если они должны получать значения из профиля пользователя).

Может ли кто-нибудь объяснить мне, можно ли это сделать и как? Большое спасибо!


person Heyl1    schedule 20.09.2010    source источник


Ответы (2)


Я почти уверен, что вам нужно перезаписать обычного администратора пользователя.

На самом деле я бы создал специальный forms.ModelForm для UserProfile с именем, скажем, UserProfileAdminForm, который также включал поля из модели User. Затем вы должны зарегистрировать UserProfile для администратора, а функция save для UserProfileAdminForm будет захватывать пользовательские поля и либо создавать, либо обновлять запись User (это остается в качестве упражнения для OP).

Больше информации

Когда я говорю добавить дополнительные поля в форму, я имею в виду их добавление вручную:

class UserProfileAdminForm(forms.ModelForm):
    username = forms.CharField(...)
    email = forms.EmailField(...)
    first_name = ...
    last_name = ...

    def __init__(self, *args, **kwargs):
        super(UserProfileAdminForm, self).__init__(*args, **kwargs)
        profile = kwargs.get('instance', None)
        if profile and profile.user:
            self.user = profile.user
            self.fields['username'].initial = self.user.username
            self.fields['last_name'].initial = ...
            ...

    class Meta:
        model = UserProfile
person Jordan Reiter    schedule 20.09.2010
comment
Спасибо за ответ. Я пробовал несколько способов, но не могу получить поля из User и UserProfile в одной форме. Насколько я знаю, это невозможно. Вы имеете в виду, что используете class Meta: model=UserProfile и вручную добавляете поля пользователя (эти поля фактически не будут связаны с моделью пользователя). Не могли бы вы объяснить немного подробнее, как вы это сделаете? - person Heyl1; 21.09.2010
comment
Да, насколько я знаю, нет способа сделать это автоматически. Но комбинация ручного ввода полей и последующего использования initial для заполнения форм, и снова использование пользовательской функции save для обработки сохранения записи пользователя позже. В вашем конкретном случае вы можете посмотреть это: scottbarnham.com/blog/2008/08/21/ - person Jordan Reiter; 21.09.2010
comment
Джордан, еще раз спасибо за ответ. Извините за поздний ответ. Я посмотрел ссылку и проверил ее. Что не сработало бы для меня, так это установка пароля, потому что ссылка на страницу создания пароля неверна. Вы должны перейти к фактическому экземпляру пользователя и сделать это там (поэтому пользователь должен быть администратором). Не знаю, есть ли у вас опыт в этом. Я думаю, что решение довольно изящное, но я немного сомневаюсь, стоит ли использовать user_profile (и в комментариях есть критика). Другое ваше предложение менее интуитивно понятно, поэтому я думаю, что выберу решение по ссылке. - person Heyl1; 29.09.2010

Этот вопрос был решен новой версией Django 1.5: https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#auth-custom-user.

person Heyl1    schedule 03.07.2013