您好,我正在尝试使用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
提前感谢所有帮助!
答案 0 :(得分:0)
使用AbstractUser
时,它会为您预先定义在模型扩展时间中定义的User
模型fields + New fields
在这里,当您扩展用户模型时,由于“用户模型”而无需显式定义电子邮件字段,请具有此字段;当您使用UserCreationForm
时,它也具有所有预定义字段,您无需重新定义它,在您的情况下,您不需要定义username,first_name,last_name,email
,但是如果您想输入额外的字段,则需要定义要在模型中添加的额外字段,例如university
或{{1} },如果您需要添加bio
或placeholder
,请使用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})
将这些内容套用在上面,让我知道是否可以工作