Django-allauth NoReverseMatch Error for 'account_login' with Custom URL Patterns
Я работаю над проектом Django, который включает аутентификацию пользователей с помощью django-allauth. Я настроил пользовательские шаблоны URL, которые включают параметр library_slug для целей многопользовательского доступа. Однако при переходе на страницу регистрации (http://localhost:8000/bgrobletest/accounts/signup/) я сталкиваюсь с ошибкой NoReverseMatch:
Вот соответствующий трассировочный бэкграунд:
Traceback (most recent call last):
File "/Users/williamgroble/lib_man/env/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
...
File "/Users/williamgroble/lib_man/env/lib/python3.12/site-packages/allauth/account/views.py", line 173, in get_context_data
login_url = self.passthrough_next_url(reverse("account_login"))
File "/Users/williamgroble/lib_man/env/lib/python3.12/site-packages/django/urls/base.py", line 88, in reverse
return resolver._reverse_with_prefix(view, prefix, *args, **kwargs)
File "/Users/williamgroble/lib_man/env/lib/python3.12/site-packages/django/urls/resolvers.py", line 851, in _reverse_with_prefix
raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for 'account_login' with no arguments not found. 1 pattern(s) tried: ['(?P<library_slug>[^/]+)/accounts/login/\\Z']
Вот мои соответствующие файлы
users/urls.py:
from django.urls import path
from . import views
app_name = 'users'
urlpatterns = [
path('<slug:library_slug>/accounts/signup/', views.CustomSignupView.as_view(), name='account_signup'),
path('<slug:library_slug>/accounts/login/', views.CustomLoginView.as_view(), name='account_login'),
# other patterns...
]
lib_man/urls.py:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('<slug:library_slug>/accounts/', include('users.urls', namespace='users')),
# other patterns...
]
users/views.py
from django.shortcuts import render, get_object_or_404
from allauth.account.views import SignupView
from catalog.models import Library
from .user_forms import CustomSignupForm
import logging
logger = logging.getLogger(__name__)
class CustomSignupView(SignupView):
form_class = CustomSignupForm
template_name = 'account/signup.html' # Set the custom template
def dispatch(self, request, *args, **kwargs):
library_slug = kwargs.get('library_slug')
logger.debug(f"Dispatching signup view with request: {request}")
logger.debug(f"Library slug from URL kwargs: {library_slug}")
if not library_slug:
logger.error("No library_slug provided in URL kwargs.")
raise ValueError("No library_slug provided.")
self.library = get_object_or_404(Library, slug=library_slug)
logger.debug(f"Library object found: {self.library}")
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['library_slug'] = self.library.slug
return context
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['library'] = self.library
logger.debug(f"Form kwargs: {kwargs}")
return kwargs
Похоже, что проблема возникает из-за того, что обратная функция в allauth пытается сгенерировать URL для 'account_login' без указания необходимого аргумента library_slug. Я пробовал всячески изменять файлы урлов и не могу понять, в чем дело.
Вопросы:
Как правильно передать параметр library_slug в обратную функцию в данном контексте? Есть ли лучший подход к обработке многопользовательских отношений с помощью django-allauth? Любая помощь будет очень признательна!