bugfix> python > 投稿

私はジャンゴが初めてです。ここでは、djangoアプリのログインを作成したいです。ユーザーアカウントを作成しようとすると、次のエラーが表示されます

FieldError at /signup/ Cannot resolve keyword 'mobile' into field Choices are: date_joined, email, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, user_permissions, username, userregform

ユーザーアカウントの作成中に、ユーザー名、電子メール、モバイル番号、パスワード、および組織名を追加します。電子メールまたはモバイルが既に存在しない場合、エラーメッセージが表示されます。

そして、ここに私のコードがあります

forms.py

User=get_user_model()
class UserLoginForm(forms.Form):
    email=forms.EmailField(label='Email address')
    password = forms.CharField(label='Password',
                          widget=forms.PasswordInput())
    def clean(self,*args,**kwargs):
        email=self.cleaned_data.get("email")
        password=self.cleaned_data.get("password")
        if email and password:
            user=authenticate(email=email,password=password)
            if not user:
                raise forms.ValidationError("This email id is not registered")
            if not user.check_password(password):
                raise forms.ValidationError("Incorrect password")
            return super(UserLoginForm,self).clean(*args,**kwargs)
class RegistrationForm(forms.ModelForm):
    username= forms.CharField(label='Username')
    email = forms.EmailField(label='Email address')
    mobile =forms.CharField(label='Mobile No')
    password = forms.CharField(label='Password')
    org_name = forms.CharField(label='Organisation Name')
    class Meta:
        model = User
        fields = ['username', 'email', 'mobile', 'password','org_name']
    def clean_email(self):
        email = self.cleaned_data.get('email')
        check_duplicate_email = User.objects.filter (email=email).exists()
        if check_duplicate_email:
            raise forms.ValidationError(
            "This email id is already registered"
            )
        return email
    def clean_mobile(self):
        mobile=self.cleaned_data.get('mobile')
        check_duplicate_mobile=User.objects.filter(mobile=mobile).exists()
        if check_duplicate_mobile:
            raise forms.ValidationError(
              "This mobile no is already registered"
            )
        return mobile

models.py

class UserRegForm(models.Model):
    email=models.OneToOneField(User,unique=True)
    mobile =models.CharField(max_length=10)
    org_name = models.CharField(max_length=254)

views.py

def login(request):
    title="Login"
    form=UserLoginForm(request.POST or None)
    if form.is_valid():
        email=form.cleaned_data.get("email")
        password = form.cleaned_data.get("password")
        user=authenticate(email=email,password=password)
        login(request,user)
    return render(request,"userRegistration/login.html",{"form":form,"title":title})
def signup(request):
    title="Signup"
    if request.method=="POST":
        form = RegistrationForm(request.POST)
        print form.is_valid() #print False
        if form.is_valid():
            user=form.save(commit=False)
            email = form.cleaned_data.get("email")
            password = form.cleaned_data.get("password")
            user=set_password(password)
            user.save()
            new_user = authenticate(email=user.email, password=password)
            login(request, new_user)
            return redirect("userRegistration/a.html")
    else:
        form=RegistrationForm()
    return render(request, "userRegistration/signup.html", {"form":form,"title":title})

html

   {% block title %}Registration{% endblock %}
    {% block content %}
        <h1>Registration</h1>
        {% if form.errors %}
        <h1>Error</h1>
        {% endif %}
        <form method="post" action="{% url 'userRegistration:signup' %}"">{% csrf_token %}
            {{ form }}
            <input type="submit" name="submit" />
        </form>
        {% endif %}
{% endblock %}</html>

回答 1 件
  • あなたの RegistrationForm   User を使用する  モデル。どこにあるのか分かりません。 (たぶんdjangoデフォルト User  モデル? )しかし、他のモデルのフィールドは使用できません。 (この状況では、 UserRegForm )。

    サインアップ中にフィールドを追加する場合は、サインアップ後に追加する必要があります。

    clean_mobile を削除するだけです  フォームから signup に追加します  見る。以下のように(これは単なる例です。独自の方法でカスタマイズする必要があります

    def signup(request):
        title="Signup"
        if request.method=="POST":
            form = RegistrationForm(request.POST)
            print form.is_valid() #print False
            if form.is_valid():
                user=form.save(commit=False)
                email = form.cleaned_data.get("email")
                password = form.cleaned_data.get("password")
                user=set_password(password)
                user.save()
                # and save UserRegForm model here
                # and call clean_mobile here
                mobile = clean_mobile(form.cleaned_data.get('mobile')
                UserRegForm.create(
                    email=user, 
                    mobile=mobile
                    ...
                )
                new_user = authenticate(email=user.email, password=password)
                login(request, new_user)
                return redirect("userRegistration/a.html")
        else:
            form=RegistrationForm()
        return render(request, "userRegistration/signup.html", {"form":form,"title":title})
    
    

あなたの答え