python - 不立即将用户保存到数据库
问题描述
我有一个问题,在用户注册后,他们被重定向到具有@login_required
; 但是,他们无法访问它,因为用户在 30 秒后出于某种原因而不是立即保存到我的数据库中。我想知道如何注册用户并立即保存他们,以便他们通过该@login_required
字段并可以正确重定向到仪表板。
注册视图
def teacher_sign_up(request):
form = TeacherSignUpForm(request.POST)
if request.method == 'POST':
form = TeacherSignUpForm(request.POST, request.FILES)
if form.is_valid():
user = form.save()
return redirect('/teacher/dashboard')
else:
messages.error(request, 'Make sure all your information is valid')
else:
form = TeacherSignUpForm()
context = {'form' : form}
return render(request, 'accounts/teacher_sign_up.html', context)
仪表板视图
@login_required
def dashboard(request):
return render(request, 'teacher/dashboard.html')
表格.py
class RegisterForm(forms.ModelForm):
email = forms.EmailField(widget=forms.EmailInput(attrs={'class' : 'form-control', 'placeholder' : 'Email', 'id' : 'email', 'required' : 'True'}))
first_name = forms.CharField(widget=forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'First name', 'id' : 'first-name', 'required' : 'True'}))
last_name = forms.CharField(widget=forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Last name', 'id' : 'last-name', 'required' : 'True'}))
password = forms.CharField(widget=forms.PasswordInput(attrs={'class' : 'form-control', 'placeholder' : 'Password', 'id' : 'password', 'required' : 'True'}))
password2 = forms.CharField(widget=forms.PasswordInput(attrs={'class' : 'form-control', 'placeholder' : 'Confirm password', 'id' : 'password2', 'required' : 'True'}))
class Meta:
model = User
# what fields from that model you want
fields = ('first_name', 'last_name', 'email', 'password', 'password2')
def clean_email(self):
email = self.cleaned_data.get('email')
qs = User.objects.filter(email=email)
if qs.exists():
raise forms.ValidationError("Email is taken")
return email
def clean_password2(self):
# Check that the two password entries match
password = self.cleaned_data.get("password")
password2 = self.cleaned_data.get("password2")
if password and password2 and password != password2:
raise forms.ValidationError("Passwords don't match")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
user = super(RegisterForm, self).save(commit=False)
user.first_name = self.cleaned_data["first_name"]
user.last_name = self.cleaned_data["last_name"]
user.set_password(self.cleaned_data["password"])
#user.active = False send confirmation email
if commit:
user.save()
return user
class TeacherSignUpForm(RegisterForm):
avatar = forms.ImageField()
country = CountryField().formfield(widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'true'}))
instrument1 = forms.ChoiceField(choices=instrument_list, widget=forms.Select(attrs={'class' : 'form-control'}))
instrument2 = forms.ChoiceField(choices=instrument_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
instrument3 = forms.ChoiceField(choices=instrument_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
instrument4 = forms.ChoiceField(choices=instrument_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
instrument5 = forms.ChoiceField(choices=instrument_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
level1 = forms.ChoiceField(choices=level_list, widget=forms.Select(attrs={'class' : 'form-control'}))
level2 = forms.ChoiceField(choices=level_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
level3 = forms.ChoiceField(choices=level_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
level4 = forms.ChoiceField(choices=level_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
level5 = forms.ChoiceField(choices=level_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
language1 = forms.ChoiceField(choices=language_list, widget=forms.Select(attrs={'class' : 'form-control'}))
language2 = forms.ChoiceField(choices=language_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
language3 = forms.ChoiceField(choices=language_list, required=False, widget=forms.Select(attrs={'class' : 'form-control'}))
resume = forms.FileField()
def save(self, commit=True):
user = super(TeacherSignUpForm, self).save(commit=False)
user.avatar = self.cleaned_data['avatar']
user.instrument1 = self.cleaned_data['instrument1']
user.instrument2 = self.cleaned_data['instrument2']
user.instrument3 = self.cleaned_data['instrument3']
user.instrument4 = self.cleaned_data['instrument4']
user.instrument5 = self.cleaned_data['instrument5']
user.level1 = self.cleaned_data['level1']
user.level2 = self.cleaned_data['level2']
user.level3 = self.cleaned_data['level3']
user.level4 = self.cleaned_data['level4']
user.level5 = self.cleaned_data['level5']
user.language1 = self.cleaned_data['language2']
user.language2 = self.cleaned_data['language2']
user.language3 = self.cleaned_data['language3']
user.resume = self.cleaned_data['resume']
user.teacher = True
if commit:
user.save()
return user
解决方案
在不知道您确切的数据库设置的情况下,我怀疑重定向不起作用,因为新用户未登录,因此@login_required
装饰器将用户重定向到登录页面。
要注册用户,请立即保存并重定向到您需要先登录新用户的仪表板:
if form.is_valid():
user = form.save()
login(request, user)
return redirect('/teacher/dashboard')
推荐阅读
- python - 计算两对 X 和 y 之间相似度的最佳实践是什么
- javascript - 从分析网络应用程序中的二维数组获取数据
- python - 使用 SolvePNP 进行姿势估计
- javascript - JavaScript 验证注册表单
- asp.net-mvc - 异常详细信息:System.InvalidOperationException:没有“IEnumerable”类型的 ViewData 项
' 有键 'Name - amazon-web-services - 即使在 AWS 免费套餐定价下也要为 EC2 收费
- shell - 根据匹配字符串拆分文件
- powerbi - Power BI - Power BI 散点图中的重叠点
- hugo - 如何在 Hugo 渲染网站的 config.toml 上插入表情符号?
- java - Hive 中的 NULLIF 在某些版本中是否存在一些已知的实现问题?