首页 > 解决方案 > 在一个页面上同时使用登录视图和 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

标签: pythondjangoauthenticationlogin

解决方案


所以你可以在页面中创建两个表单的视图

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 代码中隐藏或显示其中之一取决于您想要什么。


推荐阅读