web-dev-qa-db-fra.com

Django 2.0 - Pas une fonction d'affichage ou un nom de modèle valide (Personnalisation des vues d'authentification)

Je travaille sur un exercice de cours et je suis bloqué pendant quelques heures et je ne suis pas sûr de ce qui cause la rupture de l'application, ensuite, vous trouverez les fichiers impliqués et vous pourrez peut-être trouver la solution. Merci de votre aide!

Structure du projet

Cette erreur est levée lorsque je me connecte:

Internal Server Error: /account/login/

...


    Django.urls.exceptions.NoReverseMatch: Reverse for 'dashboard' not found. 'dashboard' is not a valid view function or pattern name.
    [04/Apr/2018 17:12:15] "POST /account/login/ HTTP/1.1" 500 151978

À la fin du fichier settings.py

from Django.urls import reverse_lazy

LOGIN_REDIRECT_URL = reverse_lazy('dashboard')
LOGIN_URL = reverse_lazy('login')
LOGOUT_REDIRECT_URL = reverse_lazy('logout')

Le fichier urls.py

from Django.contrib.auth import views as auth_views
from Django.urls import path
from . import views

app_name = 'account'

urlpatterns = [
    # path('login/', views.user_login, name='login'),
    path('', views.dashboard, name='dashboard'),

    # login / logout urls
    path('login/', auth_views.LoginView.as_view(template_name='registration/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='registration/logged_out.html'), name='logout'),
    path('logout-then-login/', auth_views.logout_then_login, name='logout_then_login'),
]

Le fichier views.py

from Django.contrib.auth import authenticate, login
from Django.contrib.auth.decorators import login_required
from Django.http import HttpResponse
from Django.shortcuts import render


@login_required
def dashboard(request):
    return render(request, 'account/dashboard.html', {'section': 'dashboard'})

Le modèle base.html

{% load staticfiles %}
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=Edge">
    <title>{% block title %}{% endblock %}</title>
    <link rel="stylesheet" href="{% static "css/base.css" %}">
</head>
<body>
    <div id="header">
        <span class="logo">Bookmarks</span>
        {% if request.user.is_authenticated %}
            <ul class="menu">
                <li> {% if section == "dashboard" %}class="selected"{% endif %}><a href="{% url "account:dashboard" %}">My dashboard</a></li>
                <li> {% if section == "images" %}class="selected"{% endif %}<a href="#">Images</a></li>
                <li> {% if section == "people" %}class="selected"{% endif %}<a href="#">People</a></li>
            </ul>
        {% endif %}

        <span class="user">
            {% if request.user.is_authenticated %}
                Hello {{ request.user.first_name }}, <a href="{% url "account:logout %}">Logout</a>
            {% else %}
                <a href="{% url "account:dashboard" %}"></a>
            {% endif %}
        </span>
    </div>

    <div id="content">
        {% block content %}
        {% endblock %}
    </div>
</body>
</html>

J'apprécie ton aide. Merci beaucoup!

11
ralfillo

Vous avez défini un espace de noms pour vos URL:

app_name = 'account'

Vous devez utiliser cet espace de noms lors de l'inversion des URL avec reverse/reverse_lazy ou {% url %}:

LOGIN_REDIRECT_URL = reverse_lazy('account:dashboard')
LOGIN_URL = reverse_lazy('account:login')
LOGOUT_REDIRECT_URL = reverse_lazy('account:logout')
13
knbk

Peut-être que lorsque vous spécifiez {% url 'appname: views'%}, vous avez spécifié le mauvais nom d'application

Par exemple, comme:

wrong - {% url 'accuant:dashboard' %}
right - {% url 'account:dashboard' %}
0
Maxocoder