NoReverseMatch at / login - ошибка с LOGIN_URL или обратная функция? - PullRequest
1 голос
/ 11 февраля 2020

Я разрабатываю приложение в Django.

Я разрабатываю аутентификацию пользователей.

У меня есть регистрация. html и login. html шаблоны внутри пути: templates> аутентификация

Все, включая функцию регистрации, работает нормально, но когда я пытаюсь получить доступ к шаблону входа, браузер возвращает :

NoReverseMatch в / login

'app' не является зарегистрированным пространством имен

Бьюсь об заклад, проблема заключается в LOGIN_URL, который я добавил в settings.py чтобы включить систему аутентификации (я следую учебному пособию). На самом деле все остальные представления работают нормально, только тот, который указывает на логин. html - нет.

Здесь ниже приведены все мои строки, относящиеся к системе аутентификации:

В моей settings.py :

LOGIN_URL = '/login'

В моей базе. html:

          {% if user.is_authenticated %}

          <li class="nav-item dropdown">

            <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">{{ user_form.username }}</a>

            <div class="dropdown-menu">

              <a class="dropdown-item" href="">profilo</a>                  
              <a class="dropdown-item" href="{% url 'logout' %}">Log out</a>

            </div>

          </li>

          {% elif not user.is_authenticated %}

          <li class="nav-item dropdown">

            <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Login</a>

            <div class="dropdown-menu">

              <a class="dropdown-item" href="{% url 'registration' %}">Registrati</a>
              <a class="dropdown-item" href="{% url 'login' %}">Accedi</a>

            </div>

          </li>

          {% endif %}

В моей аутентификация> логин. html:

{% extends 'base.html'%} <!-- vuol dire inserisci qui la navigation toolbar contenuta in base -->

{% block content %}

    <h1>Login</h1>

    <br>

    <div class="jumbotron">

        <form action="{% url 'app:login' %}" method="post">
            {% csrf_token %}

            <label for="username">Username:</label>
            <input type="text" name="username" value="" placeholder="nome utente">

            <label for="password">Password:</label>
            <input type="password" name="password" value="" placeholder="password">

            <input type="submit" name="" value="Login">

        </form>

    </div>



{% load static %}  <!-- Qui il tag è obbligatorio nonostante sia stato inserito dentro base.html -->

<!-- CSS -->
{% comment %} <link rel="stylesheet" type="text/css" href={% static "css/file.css" %}> {% endcomment %}

<!-- Javascript -->
{% comment %} <script type="text/javascript" src={% static "js/file.js" %}></script> {% endcomment %}

{% endblock %}

В моем приложении > urls.py , внутри urlpatterns список:

path('authentication/registration', views_users_authentication.registration, name="registration"),
path('login', views_users_authentication.user_login, name="login"),

в моем проекте> urls.py , Inside urlpatterns list:

path('admin/', admin.site.urls),
path('', include('app.urls')),

Затем у меня есть отдельный лист для отображения функций представлений, связанных с системой аутентификации, то есть views_users_authentication.py , который содержит:

def registration(request):

    registered = False

    # se l'utente ha lanciato il post
    if request.method=="POST":

        print("post eseguito!")
        user_form = UserForm(data=request.POST)
        profile_form = UserProfileInfoForm(data=request.POST)

        # condizione di validità del form
        if user_form.is_valid() and profile_form.is_valid():

            print("form validi!")

            user = user_form.save()
            user.set_password(user.password) # questa linea hasha la pasword
            user.save()
            # registra l'utente

            profile = profile_form.save(commit=False)
            profile.user = user

            registered=True

            print("Utente registrato con successo!")

            # condizione per registrare l'utente
            if 'profile_pic' in request.FILES:
                profile.profile_pic = request.FILES['profile_pic']
                print("Acquisita la fotografia dell'utente!")

            profile.save()
            # attenzione al salvataggio dei form e dei modelli che sono due cose diverse
                # registra le info aggiuntive



        else:
            print("Registrazione fallita:")
            print(user_form.errors, profile_form.errors)

    else:
        user_form = UserForm()
        profile_form = UserProfileInfoForm()

    context_dict = {'user_form':user_form, 'profile_form':profile_form, 'registered':registered}

    return render(request, 'authentication/registration.html', context_dict)


def user_login(request):

    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")

        user = authenticate(username=username, password=password)

        if user:
            if user.is_active:
                login(request, user)
                return HttpResponseRedirect(reverse('home'))

            else:
                HttpResponse("Account non attivo")

        else:
            print("qualcuno ha cercato di loggarsi e ha fallito")
            print("Username: {} and password {}".format(username,password))
            return HttpResponse("Inseriti parametri non validi per il login!")

    else:
        return render(request, "authentication/login.html", {})

1 Ответ

1 голос
/ 11 февраля 2020

В вашем login.html вы должны использовать просто login в качестве имени URL вместо app:login:

<form action="{% url 'login' %}" method="post">

Поскольку вы не указали пространство имен в файле urlpatterns.py. Если вы хотите использовать app пространство имен, вы можете изменить urlpatern следующим образом:

path('', include('app.urls', namespace='app')),
...