8 に答える
サインアップ時にユーザーに姓名を尋ねたいとします。次のように、これらのフィールドを独自の形式で配置する必要があります。
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_FORMS
SOCIALACCOUNT_FORMS
それで全部です。
これが、他のいくつかの回答を組み合わせた結果です(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'
ましたが、なぜかエラーになりました。
@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()
あなた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 原則を破ることはありません。
ユーザーを 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'))