25

私の質問が非常に明白であり、一緒に作業しているほとんどすべての開発者がUserProfileそれに答えることができるはずだと思うなら。

ただし、djangoのドキュメントやDjangoBookにはヘルプが見つかりませんでした。

Django Formsを使用してUserProfileフォームを作成する場合は、プロファイルフィールドと一部のUserフィールドを変更する必要があります。

しかし、forms.UserProfileForm(まだ?)ありません!

どうやってそれをしますか?

4

7 に答える 7

41

私は今日これに出くわしました、そして、いくつかのグーグルの後、私は私の意見で少しきれいな解決策を見つけました:

#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>

ソース

于 2010-02-06T16:39:02.033 に答える
35

これが私がついにやった方法です:

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
于 2009-11-13T07:25:30.523 に答える
5

これは私が現在のトランクでそれをした方法です(リビジョン:11804)。ナティムの解決策は私のために働いていませんでした。

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.]
于 2009-12-09T19:06:26.243 に答える
1

プロファイルアプリがあるdjango-basic-appsプロジェクトを使用することもできます。

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

于 2010-02-03T17:20:51.007 に答える
1

これは私がずっと前に私のプロジェクトで使用したものであり、うまくいけば、他の人がこの問題をグーグルするのを助けるはずです。

class SignUpForm(forms.ModelForm):
    first_name = forms.CharField(max_length = 30)
    last_name = forms.CharField(max_length = 30)
    username = forms.CharField(max_length = 30)
    password = forms.CharField(widget = forms.PasswordInput)
    password1 = forms.CharField(widget = forms.PasswordInput)
    class Meta:
        model = UserProfile
        exclude = ['user']

    def clean_username(self): # check if username does not exist before
        try:
            User.objects.get(username=self.cleaned_data['username']) #get user from user model
        except User.DoesNotExist :
            return self.cleaned_data['username']

        raise forms.ValidationError("This user exist already choose an0ther username")



    def clean(self, *args , **kwargs):
        super(SignUpForm).clean(*args ,**kwargs) # check if password 1 and password2 match each other
        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:#check if both pass first validation
            if self.cleaned_data['password1'] != self.cleaned_data['password2']: # check if they match each other
                raise forms.ValidationError("Passwords don't match each other")

        return self.cleaned_data
    def save(self): # create new user
        new_user = User.objects.create_user(username=self.cleaned_data['username'],password=self.cleaned_data['password1'],email=self.cleaned_data['email'])
        new_user.first_name = self.cleaned_data['first_name']
        new_user.last_name = self.cleaned_data['last_name']
        new_user.save()
        UserProf =  super(SignUpForm,self).save(commit = False)
        UserProf.user = new_user
        UserProf.save()
        return UserProf
于 2014-07-05T10:26:24.040 に答える
0

2つのモデルを1つのフォームにマージするときに、ドキュメントに情報が見つからないのは普通のことです。

あるいは、おそらく非常に明白に、次のことができます。1つはユーザー用、もう1つはユーザープロファイル用の2つのモデルフォームを作成します。名と姓のみを表示するようにuserprofilemodelformを設定します。両方のフォームを1つの<form>タグ内の同じテンプレートに配置します。送信したら、各フォームのsaveメソッドを呼び出します。

于 2009-11-13T08:28:13.900 に答える
0

バックエンドに2つのモデルフォームを用意し、それらを1つのフォームとしてテンプレートに表示してみませんか?UserProfileFormから名前フィールドを削除し、ユーザーオブジェクトの2番目のモデルフォームを作成しますか?

于 2009-12-09T19:31:09.720 に答える