質問

StackoverFlowで、信号を使用してDjangoの組み込み認証を拡張する方法をここに見つけました。私のベースユーザーは「電子メール」とパスワードで定義されています(したがって、ユーザー名はありません)。だから私はそれを自分のニーズに合わせて変更しようとしていますが、フォームの検証エラーを取得しています。奇妙なことに、エラーはuser.emailフィールドに接続されており、現時点で登録しているだけでも「既に使用されている」ことがあります。それを2回保存しようとしていますか、それとも何ですか? FormのContstructor in Shellにデータを使用して辞書を送信していたときに発見しました。 form = MyForm(data={}). 。このフォームがまだ無効になった後、メールを異なる値に変更すると最終的に私が真実になりました。

登録信号に接続されたuser_reated関数:

def user_created(sender, user, request, **kwargs):
    form = CustomRegistrationForm(request.POST, request.FILES)
    if form.is_valid():
        data = UserProfile(user=user)
        data.is_active = False
        data.first_name = form.cleaned_data['first_name']
        data.last_name = form.cleaned_data['last_name']
        data.street = form.cleaned_data['street']
        data.city = form.cleaned_data['city']
        data.save()
    else:
        return render_to_response('user/data_operations/error.html', {'errors': form._errors}, context_instance=RequestContext(request))

user_registered.connect(user_created)

私のフォーム:

class CustomRegistrationForm(RegistrationForm):
    first_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    last_name = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    street = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)
    city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict), max_length=50)

私のモデル:

class UserProfile(models.Model):
    first_name = models.CharField(_("Name"), max_length=50, blank=False,)
    last_name = models.CharField(_("Last name"), max_length=50, blank=False,)
    street = models.CharField(_("Street"), max_length=50, blank=False,)
    city = models.CharField(_("City"), max_length=50, blank=False,) 
    user = models.ForeignKey(User, unique=True, related_name='profile',)

登録フォーム:クラス登録フォーム(FORMS.FORM):

email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
                                                           maxlength=75)),
                         label=_("Adres email"))
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo"))
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
                            label=_("Haslo powtorzone"))

def clean_email(self):
    email = self.cleaned_data.get("email")
    if email and User.objects.filter(email=email).count() > 0:
        raise forms.ValidationError(
            _(u"Already in use."))
    return email
役に立ちましたか?

解決

ユーザーが保存された後、「user_registered」信号が送信されます。そのため、すでに「電子メール」フィールドが定義されています。

アップデート


落ち着きのない思考の使用:

form = CustomRegistrationForm(request.POST, request.FILES, notvalidateemail=True)

そして形式:

def __init__(self, *args, **kwargs):
    self.notvalidateemail = kwargs.pop('notvalidateemail',False)
    super(CustomRegistrationForm, self).__init__(*args, **kwargs)

def clean_email(self):
    if self.notvalidateemail:
        return
    else:
        #your cleaning here
        return email

他のヒント

問題:

あなたのフォームは最初にDjango-Registrationによって保存されます。次に、user_createdで再び保存します。

ソリューション:

  1. user_createdで別のフォームを使用します。すでに保存されていないフィールド(これらは電子メールのようなユーザーモデルから)。 user_createdに追加データを保存するだけですよね?

  2. 次のような形式にいくつかのパラメーターを追加します。

in user_created:

form = CustomRegistrationForm(dontvalidateemail=True, request.POST, request.FILES)

そして形式で 初期化;

self.dontvalidateemail = dontvalidateemail

次に、Clean_Emailで確認してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top