Django: NoReverseMatch не является допустимой функцией просмотра или именем шаблона - PullRequest
0 голосов
/ 10 июля 2020

У меня есть проект django с такой структурой:

my_project
|_ UserSignUp
  |_ urls.py
  |_ views.py
|_ Mainpage
  |_ urls.py
  |_ views.py
|_ my_project
  |_ urls.py
  |_ settings.py

Моя проблема заключается в следующем: я могу получить доступ к mysite.com/index и mysite.com/login нормально. Но если я пытаюсь открыть mysite.com/signup, я встречаю 500 Internal Server Error, точнее, выдается Ошибка:

NoReverseMatch в / signup / Реверс для входа в систему не найден. 'login' не является допустимой функцией просмотра или именем шаблона.

Off, потому что я уже погуглил об ошибке, но не обнаружил ничего особенно полезного. В описаниях, которые я нашел, объясняются ошибки, в которых была предпринята попытка получить доступ к URL-адресу приложения, а затем произошел сбой, поскольку пространство имен приложения не было предоставлено в теге URL-адреса. В моем случае я нахожусь внутри приложения и хочу получить доступ к URL-адресу проекта root. Насколько я знаю, это должно быть автоматически разрешено, и даже если нет, я не знаю, как указать django, чтобы просмотреть URL-адреса root. Действительно ли django не проверяет URL-адреса root или есть еще что-то, что я неправильно настроил? Как я могу это исправить?

Мой root urls.py:

from django.contrib import admin
from django.urls import path
from django.conf.urls import include
from django.contrib.auth import views as auth_views

urlpatterns = [
    path('', include('Mainpage.urls')),
    path('index/', include('Mainpage.urls')),
    path('mainpage/', include('Mainpage.urls')),
    path('home/', include('Mainpage.urls')),
    path('login/', auth_views.LoginView.as_view(template_name='login/login.html', redirect_field_name='index')),
    path('signup/', include('UserSignUp.urls')),
    path('logout', auth_views.LogoutView.as_view(template_name='logout/logout.html', next_page='index')),
    path('admin/', admin.site.urls),
]

Мой UserSignUp urls.py:

from django.urls import path
from django.conf.urls import include
from UserSignUp import views

urlpatterns = [
    path(r'', views.signup, name='signup'),
    path(r'account_activation_sent/', views.account_activation_sent, name='account_activation_sent'),
    path(r'activate/', views.activate, name='activate')
]

Мой UserSignUp views.py:

from django.contrib.auth import login
from django.contrib.auth.models import User
from django.contrib.sites.shortcuts import get_current_site
from django.shortcuts import render, redirect
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.template.loader import render_to_string
from UserSignUp.forms import SignUpForm
from UserSignUp.tokens import account_activation_token


def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            current_site = get_current_site(request)
            subject = 'Activate Your MySite Account'
            message = render_to_string('account_activation_email.html', {
                'user': user,
                'domain': current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })
            user.email_user(subject, message)
            return redirect('signup/account_activation_sent')
    else:
        form = SignUpForm()
    return render(request, 'UserSignUp/signup.html', {'form': form})


def account_activation_sent(request):
    return render(request, 'UserSignUp/account_activation_sent.html')


def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except (TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None

    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.profile.email_confirmed = True
        user.save()
        login(request, user)
        return redirect('index')
    else:
        return render(request, 'UserSignUp/account_activation_invalid.html')

signup.html:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Signup</title>
  </head>
  <body>
    <header>
      <h1>My Site</h1>
      {% if user.is_authenticated %}
        <a href="{% url 'logout' %}">logout</a>
      {% else %}
        <a href="{% url 'login' %}">login</a> / <a href="{% url 'signup' %}">signup</a> #<----- here it encounters error
      {% endif %}
      <hr>
    </header>
    <main>
        <h2>Sign up</h2>
  <form method="post">
    {% csrf_token %}
    {% for field in form %}
      <p>
        {{ field.label_tag }}<br>
        {{ field }}
        {% if field.help_text %}
          <small style="color: grey">{{ field.help_text }}</small>
        {% endif %}
        {% for error in field.errors %}
          <p style="color: red">{{ error }}</p>
        {% endfor %}
      </p>
    {% endfor %}
    <button type="submit">Sign up</button>
  </form>
    </main>
  </body>
</html>

1 Ответ

2 голосов
/ 10 июля 2020

В urls.py необходимо указать имя просмотров входа и выхода

urlpatterns = [
    # rest of your URL configs
    path('login/', auth_views.LoginView.as_view(template_name='login/login.html', redirect_field_name='index'),
         <b>name='login'</b>),
    path('logout', auth_views.LogoutView.as_view(template_name='logout/logout.html', next_page='index'),
         <b>name='logout'</b>),
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...