尝试在不同的urlpatterns列表中生成带有slug / pk regex组合的URL时,使用NoReverseMatch

时间:2018-08-16 02:33:27

标签: django django-views

当我加载使用GroupDetailView中的上下文和group_detail.html中的模板的页面(下面的代码)时,出现此错误:

NoReverseMatch at /groups/professional/
Reverse for 'create_profile' with keyword arguments '{'slug': 'professional', 'noun': 'profile'}' not found. 1 pattern(s) tried: ['groups\\/(?P<slug>[-\\w]+)/$create_(?P<noun>[-\\w]+)/$']

以上注意,关键字参数具有值,并且两个键都处于Django尝试的模式。

urls.py

from . import views
from profile import views as profile_views

app_name = 'group'

group_patterns = ([
    path('', views.GroupDetailView.as_view(), name='group_detail'),
    re_path(r'^create_(?P<noun>[-\w]+)/$', profile_views.profile_create_view, name='create_profile'),
])

urlpatterns = [
    re_path(r'^(?P<slug>[-\w]+)/$', include(group_patterns)),
]

上面的声明中,slug和名词位于两个不同的列表中。我试图将slug和noun放到相同的re_path函数中,但效果很好,但是我不能这样做,因为我需要它们保持分隔。

views.py

class GroupDetailView(DetailView):
    model =  Group
    template_name = group_detail.html

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        group_slug = self.kwargs['slug']
        context['group'] = group_slug
        return context

group_detail.html模板

<a role="button" href="{% url 'group:create_profile' slug=group noun='profile' %}">Create New Profile</a>

Django是否可以实现一种方法,使关键字参数实际上与子段/字符串位于两个不同的URL列表中时所尝试的模式相匹配?或者,我可以使用任何额外的代码来使其工作吗?也许使用RedirectView?此问题的解决方案也可以应用于主键与在不同列表中的段,用户名和UUID的组合。

1 个答案:

答案 0 :(得分:0)

尝试从$中删除^(?P<slug>[-\w]+)/$。从错误消息中可以看出,Django将您的网址链转换为带有2个字符串结尾的网址-绝对是一个问题:

groups\\/(?P<slug>[-\\w]+)/$create_(?P<noun>[-\\w]+)/$