Django Преплитане на потребителски профил с профил в Admin

Имам потребителски профил, който в момента се показва в администратора чрез подреден вграден. Въпреки това, тъй като имам полета като 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