116
4

8 に答える 8

177

サインアップ時にユーザーに姓名を尋ねたいとします。次のように、これらのフィールドを独自の形式で配置する必要があります。

class SignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, label='Voornaam')
    last_name = forms.CharField(max_length=30, label='Achternaam')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()

次に、設定で次のフォームをポイントします。

ACCOUNT_SIGNUP_FORM_CLASS = 'yourproject.yourapp.forms.SignupForm'

フォームがまたはをSignupFormオーバーライドするのと同じファイルで定義することはできないことに注意してください。これは、循環インポートエラーにつながるためです。ACCOUNT_FORMSSOCIALACCOUNT_FORMS

それで全部です。

于 2012-09-06T21:40:39.883 に答える
20

これが、他のいくつかの回答を組み合わせた結果です(100%完全でDRYの回答はありません)。

yourapp/forms.py

from django.contrib.auth import get_user_model
from django import forms

class SignupForm(forms.ModelForm):
    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name']

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.save()

そしてでsettings.py

ACCOUNT_SIGNUP_FORM_CLASS = 'yourapp.forms.SignupForm'

このようにして、DRY になるようにモデル フォームを使用し、新しいdef signup. 入れてみ'myproject.myapp.forms.SignupForm'ましたが、なぜかエラーになりました。

于 2016-01-27T05:34:06.287 に答える
7

@Shreyas: 以下のソリューションは最もクリーンではないかもしれませんが、機能します。もっときれいにするための提案があれば教えてください。

デフォルトのユーザー プロファイルに属さない情報を追加するには、まず yourapp/models.py にモデルを作成します。詳細については、一般的な django ドキュメントを参照してください。ただし、基本的には次のとおりです。

from django.db import models

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    organisation = models.CharField(organisation, max_length=100, blank=True)

次に、yourapp/forms.py にフォームを作成します。

from django import forms

class SignupForm(forms.Form):
    first_name = forms.CharField(max_length=30, label='Voornaam')
    last_name = forms.CharField(max_length=30, label='Achternaam')
    organisation = forms.CharField(max_length=20, label='organisation')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        # Replace 'profile' below with the related_name on the OneToOneField linking back to the User model
        up = user.profile
        up.organisation = self.cleaned_data['organisation']
        user.save()
        up.save()
于 2016-07-27T15:29:07.547 に答える
5

あなたusers/forms.pyが入れます:

from django.contrib.auth import get_user_model
class SignupForm(forms.ModelForm):
    class Meta:
        model = get_user_model()
        fields = ['first_name', 'last_name']
    def save(self, user):
        user.save()

settings.py に次のように入力します。

ACCOUNT_SIGNUP_FORM_CLASS = 'users.forms.SignupForm'

このようにして、多重度のユーザー モデル フィールド定義によって DRY 原則を破ることはありません。

于 2015-07-12T11:56:27.170 に答える
-10

ユーザーを OneToOneField としてプロファイル モデルを作成する

class Profile(models.Model):
    user = models.OneToOneField(User, verbose_name=_('user'), related_name='profiles')
    first_name=models.CharField(_("First Name"), max_length=150)
    last_name=models.CharField(_("Last Name"), max_length=150)
    mugshot = ImageField(_('mugshot'), upload_to = upload_to, blank=True)
    phone= models.CharField(_("Phone Number"), max_length=100)
    security_question = models.ForeignKey(SecurityQuestion, related_name='security_question')
    answer=models.CharField(_("Answer"), max_length=200)
    recovery_number= models.CharField(_("Recovery Mobile Number"), max_length=100)
    city=models.ForeignKey(City,related_name='city', blank=True, null=True, help_text=_('Select your City'))
    location=models.ForeignKey(Country,related_name='location', blank=True, null=True, help_text=_('Select your Location'))
于 2012-09-06T15:38:58.663 に答える