在一页上同时使用登录视图和UserCreationForm

时间:2018-07-23 12:01:44

标签: python django authentication login

我和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

1 个答案:

答案 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代码中隐藏或显示其中之一取决于您的需求。