如何在自己的视图中使用LoginView并在HTML模板中显示? 更新:

问题描述

我想使用现成的Django LoginView,但是同时我必须使用自己的视图在同一HTML模板中进行注册。如果在urls.py文件中,我将连接2个视图,而不是仅首先连接。所以我的问题是,如何在我自己的视图中使用LoginView并在Jinja中使用2种形式? 这是我的views.py文件和html;)

def index(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        formlog = auth_views.LoginView.as_view(template_name='main/index.html')

        if 'signup' in request.POST:
            if form.is_valid():
                form.supervalid()
                form.save()
                username = form.cleaned_data.get('username')
                messages.success(request,f'Dear {username} you have been created a new accound!')
                return redirect('main')
        elif 'login' in request.POST:
            if formlog.is_valid():
                formlog.save()
                username = form.cleaned_data.get('username')
                messages.success(request,f'Your account has been created! You are now able to log in')
                return redirect('main')
    else:
        form = UserRegisterForm()
        formlog = auth_views.LoginView.as_view(template_name='main/index.html')
    return render(request,'main/index.html',{'form': form,'formlog': formlog})
# this code is not working,but not returning any errors

HTML

{% if not user.is_authenticated %}
    <!-- Login -->
    <div class="container">
        <div class="log-1">
            <div class="log-0">
                <p class="logtitle">BareTalk</p>
                <form method="POST" name="login">
                    {% csrf_token %}
                    {{ formlog|crispy }}
                    <button class="log-button first" type="submit">Login</button>
                </form>
                <button class="log-button second"
                     onclick="modalwindowops.open();" id="signup">Sign Up</button>
            </div>
        </div>
    </div>

    <!-- Signup  -->
    <div class="modal-overlay">
        <div class="modal-window">
            <span class="close-modal" onclick="modalwindowops.close();">&times;</span>
            <form method="POST" name="signup">
                <p>Sign Up</p>
                {% csrf_token %}
                {{ form|crispy }}

                <button type="submit">Sign Up</button>
            </form>
        </div>
    </div>
{% else %}
    <h1>Welcome back Amigo!</h1>
{% endif %}

解决方法

if 'signup' in request.POST:视图中不会触发elif 'login' in request.POST:index(),因为您的HTML表单实际上并不包含这些输入。请注意,name元素的<form>属性是deprecated

相反,您可以在表单中添加隐藏的<input> ,如下所示:

<form method="POST">
    {% csrf_token %}
    {{ formlog|crispy }}
    <input type="hidden" name="login" value="true" />
    <button class="log-button first" type="submit">Login</button>
</form>

formlog = auth_views.LoginView.as_view(template_name='main/index.html')

视图保存到formlog,而不是表单,因此调用formlog.is_valid()会导致错误。

代替

elif 'login' in request.POST:
    if formlog.is_valid():
        formlog.save()
        username = form.cleaned_data.get('username')
        messages.success(request,f'Your account has been created! You are now able to log in')
        return redirect('main')

您可能只需要做

elif 'login' in request.POST:
    log_view = auth_views.LoginView.as_view(template_name='main/index.html')
    log_view(request)

调用is_valid()save()并进行重定向已全部由LoginView完成。如果您仍要执行自定义message.success(),则必须覆盖一个或多个LoginView方法,但这是另一个主题。

更新:

您还需要将视图formlog = auth_views.LoginView.as_view(template_name='main/index.html')(在return render...之前)更改为:

formlog = AuthenticationForm(request)

将此行带到else块之外。

还要在views.py顶部为表单添加导入:

from django.contrib.auth.forms import AuthenticationForm

此更改是必需的,因为模板需要表单对象(默认为AuthenticationForm的{​​{1}})而不是视图对象。更新的视图功能将如下所示:

LoginView

请注意,当登录凭据无效时,可以通过提供反馈来改善这一点。照原样,如果提供的凭据不起作用,此更新的代码只会重新加载空白的登录表单。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...