【问题标题】:Django form logs out userDjango表单注销用户
【发布时间】:2020-11-23 14:39:04
【问题描述】:

今天我有这个问题:

我用 Django 框架编写了一个 Sign-in Sing-out Web 应用程序。

当用户登录时,他会被重定向到索引页面。在那里,他可以看到其他用户的“帖子”,并且可以选择喜欢“帖子”。当单击like 按钮时,用户将被注销,并且根本无法访问like 视图。谁能告诉我这是为什么?

我将在下面提供一些代码。如果还不够,这里是我的项目 github:https://github.com/palm-octo-chainsaw/the-end

主 url.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('core.urls', namespace='core')),
    path('accounts/', include('accounts.urls', namespace='accounts_app')),
    path('djrichtextfield/', include('djrichtextfield.urls')),

]

core.views.py

from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
from core.models import Core
from django.contrib.auth.models import User


def home(req):
    ctx = {
        'posts': Core.objects.all(),
    }
    return render(req, 'pages/index.html', ctx)


@login_required(login_url='accounts_app:login')
def likes(req):
    if req.method == 'POST':
        if req.user:
            return redirect('core:home')


def create(req):
    pass

core.urls.py

from django.urls import path, include
from core.views import home, likes, create

app_name = 'core'

urlpatterns = [
    path('', home, name='home'),
    path('like/', likes, name='like'),
    path('create/', create, name='create')
]

accounts.views.py

from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login, logout
from accounts.forms import RegisterUserForm, LoginForm


def sign_up(req):

    if req.method == 'POST':
        form = RegisterUserForm(req.POST)
        if form.is_valid():
            user = form.save()
            login(req, user)
            return redirect('core:home')
    elif req.method == 'GET':
        form = RegisterUserForm()
        ctx = {
            'form': form
        }
        return render(req, 'registration/sign_up.html', ctx)


def login_view(req):

    if req.method == 'POST':
        form = LoginForm(data=req.POST)
        if form.is_valid():
            user = form.get_user()
            login(req, user)
            return redirect('core:home')
    elif req.method == 'GET':
        form = LoginForm()
        ctx = {
            'form': form
        }
        return render(req, 'registration/login.html', ctx)


def logout_view(req):

    if req.method == 'POST':
        print('++++++++++++++++++++')
        print(req)
        logout(req)
        return redirect('accounts_app:login')

accounts.urls.py

from django.contrib import admin
from django.urls import path
from accounts.views import sign_up, logout_view, login_view

app_name = 'accounts_app'

urlpatterns = [
    path('sign_up/', sign_up, name='sign-up'),
    path('login/', login_view, name='login'),
    path('logout/', logout_view, name='logout')
]

模板:

{% include "pages/base.html" %}
{% block content %}

{% if user.is_authenticated %}
{% for post in posts %}

<main role="main" class="container">
    <div class="jumbotron">
        <h1>{{ post.username }}</h1>
        <h4>{{ post.content|safe }}</h4>
        <form action="{% url 'core:like' %}" method="POST">
            {% csrf_token %}
            <button class="btn btn-primary">{{ post.likes }}</button>
        </form>
    </div>
</main>

{% endfor %}
{% endif %}
{% endblock content %}

导航栏:

<nav class="navbar navbar-expand-sm bg-dark navbar-dark mb-4">
    <div class="navbar-collapse collapse justify-content-between">
        <ul class="navbar-nav mg-auto">
            <li class="nav-item active">
                <a class="navbar-brand ml-4" href="{% url 'core:home' %}">
                    <h2>YASM</h2>
                </a>
            </li>
        </ul>
        <ul class="navbar-nav mg-auto">
            <li class="nav-item">
                <h3>Welcome {{ user }} to YASM!</h3>
            </li>
        </ul>
        <ul class="navbar-nav mg-auto">
            <li>
                <a href="{% url 'core:create' %}">Create</a>
            </li>
            <li class="nav-item dropdown">
                <div class="text-center">
                    <a class="nav-item active navbar-brand" href="#" id="navbarDropdownMenuLink">
                        <h3>{{ user.username }}</h3>
                    </a>
                </div>
                <div class="dropdown-menu dropdown-menu-right text-center" aria-labelledby="navbarDropdownMenuLink">
                    <a class="dropdown-item" href="#">Action</a>
                    <form action="{% url 'accounts_app:logout' %}" method="POST">
                        {% csrf_token %}
                        <input class="dropdown-item" type='submit' value="Logout" />
                </div>
            </li>
        </ul>
    </div>
</nav>

如果您需要更多信息,请写在下面或查看提供的 github。

提前感谢您的帮助! :)

【问题讨论】:

  • 可以分享一下放点赞按钮的模板代码吗?
  • 我刚刚编辑了这个问题。很抱歉给您带来不便。

标签: python django django-views django-forms django-templates


【解决方案1】:

导航栏中缺少表单的结束标记,这导致注销表单跨越直到找到下一个 &lt;/form&gt; 标记。

<nav class="navbar navbar-expand-sm bg-dark navbar-dark">
    <div class="navbar-collapse collapse justify-content-between">
        <ul class="navbar-nav mg-auto">
            <li class="nav-item active">
                <a class="navbar-brand ml-4" href="{% url 'core:home' %}">YASM</a>
            </li>
        </ul>
        <ul class="navbar-nav mg-auto">
            <li class="nav-item dropdown">
                <div class="text-center">
                    <a class="nav-item active navbar-brand" href="#" id="navbarDropdownMenuLink">{{ user|upper }}</a>
                </div>
                <div class="dropdown-menu dropdown-menu-right text-center" aria-labelledby="navbarDropdownMenuLink">
                    <a class="dropdown-item" href="#">Action</a>
                    <form action="{% url 'accounts_app:logout' %}" method="POST">
                        {% csrf_token %}
                        <input class="dropdown-item" type='submit' value="Logout" />
                    </form> <--- Missing tag
                </div>
            </li>
        </ul>
    </div>
</nav>

【讨论】:

  • @K.Г。您的评论可能会被不恰当的语言标记为粗鲁。
猜你喜欢
  • 2021-11-23
  • 2019-01-05
  • 2013-02-13
  • 1970-01-01
  • 2023-04-06
  • 2023-03-27
  • 1970-01-01
  • 2018-08-07
  • 2019-08-26
相关资源
最近更新 更多