Форма Django выводит пользователя из системы

#python #django #django-views #django-forms #django-templates

#python #django #django-представления #django-forms #django-шаблоны

Вопрос:

Сегодня у меня возникла эта проблема:

Я написал отдельное веб-приложение для входа в систему с помощью платформы Django.

Когда пользователь входит в систему, он перенаправляется на страницу индекса. Там он может видеть «сообщения» других пользователей и имеет возможность поставить лайк «сообщению». При нажатии кнопки «Мне нравится» пользователь выходит из системы, а просмотр «Мне нравится» вообще не доступен. Может кто-нибудь сказать мне, почему это так?

Я приведу некоторый код ниже. Если этого недостаточно, вот мои проекты на 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.

Заранее благодарим вас за помощь! 🙂

Комментарии:

1. Можете ли вы поделиться кодом шаблона, в котором размещена кнопка «Мне нравится»?

2. Я только что отредактировал вопрос. Извините за неудобства.

Ответ №1:

Закрывающий тег формы отсутствует в вашей панели навигации, что приводит к тому, что форма выхода из системы распространяется до тех пор, пока не найдет следующий </form> тег.

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

Комментарии:

1. @K.Г. Вы рискуете, что ваш комментарий будет помечен как грубый из-за неуместного языка.