简体   繁体   English

自定义用户创建表单在 Django 中始终无效

[英]Custom user creation form always invalid in Django

I am working on building a new Django Website and am trying to make an abstract base class and using forms to fill it out.我正在构建一个新的 Django 网站,并尝试创建一个抽象基类并使用表单来填写它。 I thought I was doing it correctly, but whenever I try to fill out the form it is always invalid.我以为我做对了,但是每当我尝试填写表格时,它总是无效的。 I am wondering if anyone can help me with this problem.我想知道是否有人可以帮助我解决这个问题。 All of the other help I find online does not help me.我在网上找到的所有其他帮助都对我没有帮助。 Here is my code.这是我的代码。 Thanks谢谢

My forms.py我的表格.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

from .models import Profile

class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)
    class Meta:
        model = Profile
        fields = ('username', 'first_name', 'last_name', 'email', 'password1', 'password2')

    def __init__(self, regLinkModel):
        super(CustomUserCreationForm, self).__init__()
        self.linkInfo = regLinkModel

    def save(self, commit=True):
        user = super(CustomUserCreationForm, self).save(commit=False)
        user.username = self.cleaned_data['username']
        user.email = self.cleaned_data['email']
        user.first_name = self.cleaned_data['fname']
        user.last_name = self.cleaned_data['lname']
        user.password1 = self.cleaned_data['password1']
        user.password2 = self.cleaned_data['password2']
          
        if commit:
            user.save()
        return user

My Models.py我的模型.py

class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, first_name, last_name, password):
        if not email:
             raise ValueError("User needs email address")
        if not username:            
             raise ValueError("User needs username")
        if not first_name:            
            raise ValueError("User needs first name")
        if not last_name:            
            raise ValueError("User needs last name")
        user = self.model(
            email=self.normalize_email(email),
            password = password,
            username =username,
            first_name = first_name,
            last_name = last_name,
        )

        user.set_password(password1)
        user.save(using=self._db)
        return user
    def create_superuser(self, email, username, password, first_name, last_name):
        user = self.create_user(
            email=self.normalize_email(email),
            password = password,
            username =username,
            first_name = first_name,
            last_name = last_name,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

    def count_total_profiles(self):
        return Profile.objects.filter(license_id= self.id).count()

    def count_active_profiles(self):
        return Profile.objects.filter(license_id= self.id).filter(is_active=True).count()

    def is_expired(self):
        return timezone.now() > self.expire_date

    def __repr__(self):
        return self.name

class Profile(AbstractBaseUser):
    email =models.EmailField(verbose_name='email', max_length=60, unique=True)
    username = models.CharField(max_length=30, unique=True, default=" ")
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    first_name = models.CharField(max_length=30, default=" ")
    last_name = models.CharField(max_length=30, default=" ")
    password1 = models.CharField(max_length=20,default= " ")
    password2 = models.CharField(max_length=20,default= " ")
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username', 'first_name', 'last_name', 'password1', 'password2']

    objects = MyAccountManager()

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

My view.py我的视图.py

def regUser(request):
    if request.method == "POST":
        form = CustomUserCreationForm(request.POST)
        print(form)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect("/")
        else:
            return redirect("/youdiditwrong")

My HTML code我的 HTML 代码

<HTML>
<head>
<title>Create a User</title>
</head>

<body>
<h1>User: </h1>
<form action="" method="POST">
{% csrf_token %}
First Name: <input type="text" name="fname"/><br/>
Last Name: <input type="text" name="lname"/><br/>
Username: <input type="text" name ="username"/><br/>
Email:<input type="text" name="email"/><br/>
Password:<input type="text" name="password1"/><br/>
Confirm Password:<input type="text" name="password2"/><br/>
<input type="submit" value="Post"/>
</form>
</body>

</html>

I think your code should look something like this, you have to add the jinja2 in the html, so that you can use the form you created我认为您的代码应该是这样的,您必须在 html 中添加 jinja2,以便您可以使用您创建的表单

<HTML>
<head>
<title>Create a User</title>
</head>

<body>
<h1>User: </h1>
<form action="" method="POST">
{% csrf_token %}
<!-- This is the first option
{{ form.first_name }}
{{ form.last_name }}
{{ form.username }}
{{ form.email }}
{{ form.password }}
{{ form.password2 }}
-->
<!-- This is second option
{{ form.as_ul }}
-->
<input type="submit" value="Post"/>
</form>
</body>

</html>

views.py视图.py

def regUser(request):
    if request.method == "POST":
        form = CustomUserCreationForm(request.POST)
        print(form)
        if form.is_valid():
            user = form.save()
            login(request, user)
            return redirect("/")
        else:
            return redirect("/youdiditwrong")
    else: # if the method is not POST
        return render(request, "page with the html", 
    {"form": CustomUserCreationForm()}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM