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

2024-05-08 17:39:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我和Django斗争了几天,最不愉快的是在网上很难找到答案。我正在练习登录/注册表单和身份验证。首先,我有自己的登录和注册表单,但当我发现Django有自己的内置登录系统时,我尝试使用了一个,但问题是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

Tags: selfformemailrequiredformspasswordwidgetattrs
1条回答
网友
1楼 · 发布于 2024-05-08 17:39:45

因此,您可以在页面中使用两个窗体创建视图

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代码中隐藏或显示其中一个取决于你想要什么。你知道吗

相关问题 更多 >

    热门问题