抽象用户注册

时间:2020-02-27 04:32:33

标签: django django-models django-forms django-users

您好,我正在尝试使用Abstract User扩展Django User模型,但注册时出现OperationalError

错误:

OperationalError at /main/signup/
no such column: main_profile.username

我的个人资料模型:

class Profile(AbstractUser):

    email = models.EmailField(max_length=150)
    bio = models.TextField() 
    university = models.CharField(max_length=30)

    def __str__(self):
        return self.username

    CREATED = 0
    ACTIVE = 1
    BANNED = 2
    KICKED = 3
    UPGRADE = 4
    STS = (
        (CREATED, 'Just Created'),
        (ACTIVE, 'Activated'),
        (BANNED, 'Disabled'),
        (KICKED, 'Disabled'),
        (UPGRADE, 'Active'),
     )
    status = models.IntegerField(choices=STS, default=CREATED, blank=True, null=True)

我的注册表单:

class SignUpForm(UserCreationForm):

    username = forms.CharField(
        label='',
        max_length=30,
        min_length=5,
        required=True,
        widget=forms.TextInput(
            attrs={
                "placeholder": "Username",
                "class": "form-control"
            }
        )
    )

    first_name = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=True,
        widget=forms.TextInput(
            attrs={
                "placeholder": "First name",
                "class": "form-control"
            }
        )
    )

    last_name = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=True,
        widget=forms.TextInput(
            attrs={
                "placeholder": "Last name",
                "class": "form-control"
            }
        )
    )

    university = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=False,
        widget=forms.TextInput(
            attrs={
                "placeholder": "University",
                "class": "form-control"
            }
        )
    )

    email = forms.EmailField(
        label='',
        max_length=255,
        required=True,
        widget=forms.EmailInput(
            attrs={
                "placeholder": "Email",
                "class": "form-control"
            }
        )
    )

    password1 = forms.CharField(
        label='',
        max_length=30,
        min_length=8,
        required=True,
        widget=forms.PasswordInput(
            attrs={
                "placeholder": "Password",
                "class": "form-control"
            }
        )
    )

    password2 = forms.CharField(
        label='',
        max_length=30,
        min_length=8,
        required=True,
        widget=forms.PasswordInput(
            attrs={
                "placeholder": "Confirm Password",
                "class": "form-control"
            }
        )
    )

    class Meta:

        model = Profile
        fields = ('username', 'first_name', 'last_name', 'email','university',) 

        def save(self, commit=True):
            user = super(UserCreationForm,self).save(commit = False)
            user.email = self.cleaned_data['email']
            user.university = self.cleaned_data['university']
            if commit:
                user.save()
            return user

我的注册视图:

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            user.refresh_from_db()  # load the profile instance created by the signal
            user.profile.university = form.cleaned_data.get('university')
            user.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            #user_login(request, user)
            return redirect('main:main_page')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

我也已经在设置中添加了tis

AUTH_USER_MODEL = 'main.Profile'

我不明白为什么AbstractUser应该已经提供了用户名?还是我必须将所有字段(甚至密码)添加到Profile模型中?

以下也是我的自定义编辑资料-但是我不知道它是否正确:

class EditProfileForm(UserChangeForm):

    username = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=False,
        widget=forms.TextInput(
            attrs={
                "placeholder": "Username",
                "class": "form-control"
            }
        )
    )


    first_name = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=False,
        widget=forms.TextInput(
            attrs={
                "placeholder": "First name",
                "class": "form-control"
            }
        )
    )

    last_name = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=False,
        widget=forms.TextInput(
            attrs={
                "placeholder": "Last name",
                "class": "form-control"
            }
        )
    )

    university = forms.CharField(
        label='',
        max_length=50,
        min_length=2,
        required=False,
        widget=forms.TextInput(
            attrs={
                "placeholder": "University",
                "class": "form-control"
            }
        )
    )

    email = forms.EmailField(
        label='',
        max_length=255,
        required=False,
        widget=forms.EmailInput(
            attrs={
                "placeholder": "Email",
                "class": "form-control"
            }
        )
    )

    bio = forms.CharField(
        required=False,
        widget=forms.Textarea(
            attrs={
                "placeholder":"Enter something about yourself",
                "class": "form-control"
            }
        )
    )


    password = None

    class Meta:
        model = Profile
        fields=('username','first_name','last_name','email','bio',)
        def save(self, commit = True):
            user = super(UserChangeForm, self).save(commit=False)
            user.bio = self.cleaned_data['bio']

            if commit:
                user.save()
            return user

提前感谢所有帮助!

1 个答案:

答案 0 :(得分:0)

使用AbstractUser时,它会为您预先定义在模型扩展时间中定义的User模型fields + New fields

在这里,当您扩展用户模型时,由于“用户模型”而无需显式定义电子邮件字段,请具有此字段;当您使用UserCreationForm时,它也具有所有预定义字段,您无需重新定义它,在您的情况下,您不需要定义username,first_name,last_name,email,但是如果您想输入额外的字段,则需要定义要在模型中添加的额外字段,例如university或{{1} },如果您需要添加bioplaceholder,请使用pre_define方法bootstrap classes,我会在您的代码中应用

@ model.py

def __init__

@ form.py

class Profile(AbstractUser):
    # remove email fields
    bio = models.TextField() 
    university = models.CharField(max_length=30)

    def __str__(self):
        return self.username

@ views.py

class SignUpForm(UserCreationForm):
        university=formforms.CharField(label='',max_length=50,min_length=2)

        class Meta:
                model = Profile
                fields = ('username', 'first_name', 'last_name', 'email','university',) 

                def __init__(self,*args,**kwargs):
                        super().__init__(*args,**kwargs)
                        for field in self.fields:
                                self.fields[field].widget.attrs.update({'class':'form-control','placeholder':self.fields[field].label})

将这些内容套用在上面,让我知道是否可以工作