【问题标题】:NoReverseMatch error Django 1.10NoReverseMatch 错误 Django 1.10
【发布时间】:2017-07-30 00:11:44
【问题描述】:

我是 Django 新手,似乎找不到解决问题的方法

我收到以下错误

Reverse for 'todo_list' with arguments '()' and keyword arguments

 '{'cid': 1}' not found. 1 pattern(s) tried: ['todo/(?P<cid>)/']
    1   {% extends "base.html" %}
    2   {% block nav_title %} Company Batches {% endblock nav_title %}
    3   {% block content %}
    4     <div class="jumbotron">
    5   
    6         {% for obj in object_list %}
    7             <a href={% url 'todo_list' cid=obj.company.id%} class="href-nostyle">
    8                  <div class="container">
    9                     <div class="jumbotron" style="background:white">
    10                         <div class="text-center">
    11                             <h1>{{ obj.company }}<br>
    12                                 <small>{{ obj.job }}</small>
    13                             </h1>
    14                         </div>
    15                    </div>
    16                 </div>
    17            </a>

此模板位于名为 company_batches 的应用中,我正在尝试使用 href 将用户导航到 todo 应用

我的网址标签是

{% url 'todo_list' cid=obj.company.id%}

我的主要 urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', home, name='home'),
    url(r'^batches/', include('company_batches.urls')),
    url(r'^todo/', include('todo.urls'), name='todo')
]

tod​​o/urls.py

urlpatterns = [
    url(r'^$', ToDoCreateView.as_view(), name='todo_create'),
    url(r'^(?P<cid>)/', ToDoListView.as_view(), name='todo_list'),
    ]

相关views.py

 class ToDoListView(ListView,):
    template_name = 'todo/todo_list.html'
    def get_context_data(self, *args, **kwargs):
       context = super(ToDoListView, self).get_context_data(*args, **kwargs)
       return context
    def get_queryset(self, cid):
       return ToDoList.objects.filter(company=self.cid)

我不知道我做错了什么,非常感谢一些指导

【问题讨论】:

  • 您在正则表达式中的cid 捕获组为空。

标签: python django django-1.10


【解决方案1】:

这里有几点需要注意。

正则表达式,可能是这里的实际问题
url regex 中捕获cid 不包含正确的捕获组。由于它是一个 ID,您应该只捕获带有 \d+ 的数字

url(r'^(?P<cid>\d+)/', ToDoListView.as_view(), name='todo_list'),

关闭网址正则表达式
当前 url 不包含结束符号。如果 url 实际上在 /app/&lt;id&gt;/ 之后结束,您很可能应该使用美元符号 $ 关闭正则表达式。

url(r'^(?P<cid>\d+)/$', ToDoListView.as_view(), name='todo_list'),

命名空间使用
您正在使用name,同时包含todo 应用程序网址。要正确使用命名空间,您应该在 todo/ url 中删除名称并添加 namespace 到包含。

url(r'^todo/', include('todo.urls', namespace='todo'))

现在您可以在模板中使用命名空间

{% url 'todo:todo_list' cid=obj.company.id %}

【讨论】:

  • 是的,你是对的,我的正则表达式没有正确捕获 cid。感谢您的详细回答
【解决方案2】:

你的正则表达式坏了;它没有任何字符可以匹配。看起来你想捕获一个数字 PK,应该是:

r'^(?P<cid>\d+)/

【讨论】:

    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2015-10-24
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多