我和Django奋斗了几天,最荒唐的事情是实际上很难在Internet上找到答案。我正在练习登录/注册表单和身份验证。首先,我有自己的登录和注册表格,但是当我发现Django从django.contrib.auth.views
起拥有自己的内置登录系统时,我尝试使用一个登录名并坚持认为login
是整个视图,它忽略了我的注册表。因此,只是看起来像一个块,我可以根据自己的需要切换到登录或注册,但只显示一个登录表单。我正在寻找一种解决方案,使我可以将两种形式组合在一页上。
urls.py:
urlpatterns = [
url(r'^admin/', admin.site.urls),
path('', login, {'template_name':'index.html'}),
path('accounts/', views.account)]
forms.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
答案 0 :(得分:0)
因此您可以在页面中使用两种形式创建视图
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代码中隐藏或显示其中之一取决于您的需求。