python - 在一个页面上同时使用登录视图和 UserCreationForm
问题描述
我与 Django 斗争了几天,最不愉快的是在互联网上实际上很难找到答案。我正在练习登录/注册表单和一般的身份验证。首先,我有自己的登录和注册表单,但是当我发现 Django 有它自己的内置登录系统时django.contrib.auth.views
,我尝试使用一个并遇到login
了整个视图的问题,它忽略了我的注册表单。因此,它必须看起来像一个块,我可以根据我的需要切换到登录或注册,但出现唯一的登录表单。我正在寻找一种解决方案,它允许我在一个页面上组合两种形式。
网址.py:
urlpatterns = [
url(r'^admin/', admin.site.urls),
path('', login, {'template_name':'index.html'}),
path('accounts/', views.account)]
表格.py:
class login_form(forms.Form):
email = forms.EmailField(widget=forms.EmailInput(
attrs={
'class':'form-control',
'placeholder':'Enter email',
}
))
password = forms.CharField(widget=forms.PasswordInput(
attrs={
'class':'form-control',
'placeholder':'Enter password',
}
) )
class register_form(UserCreationForm):
username = forms.CharField(required=False, widget=forms.HiddenInput())
email = forms.EmailField(required=True, widget=forms.EmailInput(
attrs={
'class':'form-control',
'placeholder':'Enter email'
}
))
password1 = forms.CharField(required=True, widget=forms.PasswordInput(
attrs={
'class':'form-control',
'placeholder':'Enter password'
}
))
password2 = forms.CharField(required=True, widget=forms.PasswordInput(
attrs={
'class': 'form-control',
'placeholder': 'Confirm password'
}
))
class Meta:
model = User
fields = (
'username',
'email',
'password1',
'password2'
)
def save(self, commit=True):
user = super(register_form, self).save(commit=False)
user.email = self.cleaned_data['email']
user.username = user.email
user.password1 = self.cleaned_data['password1']
user.password1 = self.cleaned_data['password2']
if commit:
user.save()
return user
解决方案
所以你可以在页面中创建两个表单的视图
def user_auth(request):
if request.method == 'POST':
form_type = request.POST.get('type', None)
if form_type == 'login':
login_form = LoginForm(request.POST)
if login_form.is_valid():
# do what you want
if form_type == 'registration':
registration_form = RegisterForm(request.POST)
if registration_form.is_valid():
# do what you want
else:
# unrecognize type
else:
login_form = LoginForm()
registration_form = RegistrationForm()
context = {'login_form': login_form, 'registration_form': registration_form}
return render(request, 'your_template_name.html', context)
然后在您的模板中:
<form action='{% url 'name_of_your_view' %}' method='POST'>
{% csrf_token %}
<input name='type' value='login' style='display: none'>
{{ login_form }}
<input type='submit'>
</form>
<form action='{% url 'name_of_your_view' %}' method='POST'>
{% csrf_token %}
<input name='type' value='registration' style='display: none'>
{{ registration_form }}
<input type='submit'>
</form>
并且在您的 JS 代码中隐藏或显示其中之一取决于您想要什么。
推荐阅读
- google-apps-script - 如何使用电子表格和 appscript 在网页中创建数据表
- java - 为 docker 外部化 spring 数据源属性
- powershell - 要在 powershell 脚本中转换的批处理文件
- laravel - Laravel Date Mutator 需要解析吗?
- python - 重命名数据框列
- c# - C#如何将字节写入字节[]数组的中间
- awk - AWK:我如何减去那些有数字的行上的最后一个字段
- lua - 尝试索引全局“playButton”(零值)
- sql - 标准 SQL 中的窗口函数兼容性
- azure-stream-analytics - Azure 流分析边缘模块部署上的“在推送边缘包期间无法获取框架程序集本地路径”消息