Как создать форму UserProfile в Django с first_name, last_name модификации?

Выезд boost.org . Это обеспечивает большую дополнительную функциональность, особенно их реализации интеллектуального указателя.

22
задан markwalker_ 27 September 2017 в 09:12
поделиться

6 ответов

Вот как я в итоге сделал:

class UserProfileForm(forms.ModelForm):
    first_name = forms.CharField(label=_(u'Prénom'), max_length=30)
    last_name = forms.CharField(label=_(u'Nom'), max_length=30)

    def __init__(self, *args, **kw):
        super(UserProfileForm, self).__init__(*args, **kw)
        self.fields['first_name'].initial = self.instance.user.first_name
        self.fields['last_name'].initial = self.instance.user.last_name

        self.fields.keyOrder = [
            'first_name',
            'last_name',
            ...some_other...
            ]

    def save(self, *args, **kw):
        super(UserProfileForm, self).save(*args, **kw)
        self.instance.user.first_name = self.cleaned_data.get('first_name')
        self.instance.user.last_name = self.cleaned_data.get('last_name')
        self.instance.user.save()

    class Meta:
        model = UserProfile
35
ответ дан 29 November 2019 в 03:29
поделиться

Я считаю нормальным, что вы не найдете никакой информации в документации, когда вы объединяете две модели в единую форму.

В качестве альтернативы и, возможно, очень очевидно, вы можете: создать две формы модели, одну для пользователя, а другую - для профиля пользователя. Установите в форме профиля пользователя отображение только имени и фамилии. Поместите обе формы в один шаблон в один тег

. После отправки вызовите методы сохранения каждой формы.

0
ответ дан 29 November 2019 в 03:29
поделиться

Вот как я это сделал в текущем стволе (ревизия: 11804). Решение Natim у меня не работает.

В admin.py :

class ProfileAdmin(admin.ModelAdmin):
    form = ProfileForm

    def save_model(self, request, obj, form, change):
        obj.user.first_name = form.cleaned_data['first_name']
        obj.user.last_name = form.cleaned_data['last_name']
        obj.user.save()
        obj.save()

В forms.py :

class ProfileForm(forms.ModelForm):
    first_name = forms.CharField(max_length=256)
    last_name = forms.CharField(max_length=256)

    def __init__(self, *args, **kwargs):
        super(ProfileForm, self).__init__(*args, **kwargs)
        try:
            self.fields['first_name'].initial = self.instance.user.first_name
            self.fields['last_name'].initial = self.instance.user.last_name
        except User.DoesNotExist:
            pass

    class Meta:
         fields = ['first_name', 'last_name', ...etc.]
5
ответ дан 29 November 2019 в 03:29
поделиться

Почему бы не иметь две модельные формы на серверной части и просто не представить их как одну форму в вашем шаблоне? Отбросьте поля имени из формы UserProfileForm и создайте вторую модельную форму для объекта пользователя?

0
ответ дан 29 November 2019 в 03:29
поделиться

Вы также можете попробовать использовать проект django-basic-apps, в котором есть приложение профилей:

https://github.com/nathanborror/ django-basic-apps

1
ответ дан 29 November 2019 в 03:29
поделиться

Я наткнулся на это сегодня и после некоторого поиска в Google нашел решение, которое, на мой взгляд, немного чище:

#in forms.py
class UserForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ["username", "email"]

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile

#in views.py
def add_user(request):
    ...
    if request.method == "POST":
        uform = UserForm(data = request.POST)
        pform = UserProfileForm(data = request.POST)
        if uform.is_valid() and pform.is_valid():
            user = uform.save()
            profile = pform.save(commit = False)
            profile.user = user
            profile.save()
            ....
    ...

#in template
<form method="post">
    {{ uform.as_p }}
    {{ pform.as_p }}
    <input type="submit" ...>
</form>

Источник

37
ответ дан 29 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: