АннотацияПользовательская регистрация - PullRequest
1 голос
/ 27 февраля 2020

Здравствуйте. Я пытаюсь расширить Django Пользовательскую модель с использованием Абстрактного пользователя, но я получаю 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})

Я также добавил это в настройку

AUTH_USER_MODEL = 'main.Profile'

Я не понять, почему возникает ошибка, если AbstractUser уже предоставил имя пользователя? Или мне нужно добавить все поля в модель профиля, даже пароли?

Ниже приведен также мой пользовательский профиль редактирования - однако я не знаю, правильно ли он:

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 голосов
/ 27 февраля 2020

Когда вы используете AbstractUser, это дает вам предопределенную User модель fields + New fields, которую вы определяете во время расширения модели

здесь, когда вы расширяете пользовательскую модель, не требуется явно определять поле электронной почты из-за 'User модель 'Имеют это поле, и когда вы используете UserCreationForm, оно также имеет все предопределенные поля, вам не нужно переопределять его, в вашем случае вы определяете username,first_name,last_name,email, что это не нужно, но если вы хотите получить дополнительный ввод Затем вам нужно определить дополнительное поле, которое вы добавляете в свою модель, например university или bio, а если вам нужно добавить placeholder или bootstrap classes, вы используете метод pre_define def __init__ я даю вам возможность применить его в Вы код

@model.py

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

    def __str__(self):
        return self.username

@form.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})

@views.py

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=user.username, password=raw_password)
            return redirect('main:main_page')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

применить вышеуказанные вещи и дай мне знать, если работа или нет

...