【问题标题】:Django Reverse for 'document' with keyword arguments {'title':'computer science'} not found. 1 pattern tried没有找到带有关键字参数 {'title':'computer science'} 的 'document' 的 Django Reverse。尝试了 1 种模式
【发布时间】:2020-09-14 19:45:12
【问题描述】:

我得到一个 NoReverseMatch 异常,但我看不到我的错误。

网址文件:

url(r'^Demo$', views.demo, name='demo'),
url(r'^Demo/(?P<title>[\w-]+)/$', views.demo_document, name='demo_document'),
url(r'^Document_list$', views.document_list, name='document_list'),

模板:

{% for demotext in demotexts %}
      <li><a href="{% url 'keywordExtraction:demo_document' title=demotext.title %}">{{ demotext.title }}</a></li>
{% endfor %}

观看次数:

def demo(request):
    demotexts = DemoText.objects.all().order_by('date')
    return render(request, 'keywordExtraction/demo.html', {'demotexts': demotexts})


def demo_document(request, title):
    demotext = DemoText.objects.get(title=title)
    demotexts = DemoText.objects.all().order_by('date')
    return render(request, 'keywordExtraction/demo.html', {'demotext': demotext, 'demotexts': demotexts})

消息:

未找到带有关键字参数“{'title': 'Computer Science'}' 的“demo_document”的反向操作。尝试了 1 种模式:['KeywordExtraction/Demo/(?P[\w-]+)/$']

/views.py 在演示中

return render(request, 'keywordExtraction/demo.html', {'demotexts': demotexts})

本地变量

Variable     Value

demotexts    <QuerySet [<DemoText: DemoText object (4)>, <DemoText: DemoText object (5)>]>

request      <WSGIRequest: GET '/KeywordExtraction/Demo'>

【问题讨论】:

  • 'Computer Science'不是有效的 slug,slug 没有空格,它使用连字符。

标签: python django


【解决方案1】:

[\w-]+ 与空格不匹配。此模式用于slugs [Django-doc]。 slug 是一种在浏览器中愉快地呈现文本的方式,因为空格被呈现为%20,而连字符被呈现为-

为了制作 slug,您可以使用 django-autoslug package [readthedocs] 中的 SlugField [Django-doc]AutoSlugField [readthedocs]django-autoslug 可能更方便。

您可以在本地环境中安装它:

pip install <b>django-autoslug</b>

然后你可以在你的模型中添加一个 slug:

from autoslug import AutoSlugField

class DemoText(models.Models):
    title = models.CharField(max_length=128, unique=True)
    slug = AutoSlugField(populate_from='title')

默认情况下SlugField 还会在列上添加db_index,以便快速检索。

然后在你的url中你可以匹配它,可能最好将参数重命名为slug以避免混淆:

url(r'^Demo/(?P<b>&lt;slug&gt;</b>[\w-]+)/$', views.demo_document, name='demo_document'),

在视图中,你可以在slug上进行匹配:

def demo_document(request, slug): demotext = DemoText.objects.get(slug=slug) demotexts = DemoText.objects.all().order_by('date') return render(request, 'keywordExtraction/demo.html', {'demotext': demotext, 'demotexts': demotexts})

在模板中,你用 slug 渲染它:

{% for demotext in demotexts %}
      <li><a href="{% url 'keywordExtraction:demo_document' slug=demotext.slug %}">{{ demotext.title }}</a></li>
{% endfor %}

您可能需要再次填充数据库以生成 slug。

【讨论】:

  • 谢谢,我没看懂这个模式。
猜你喜欢
  • 2012-10-23
  • 2021-02-20
  • 2020-11-16
  • 2019-04-09
  • 2016-03-18
  • 2015-02-08
  • 1970-01-01
  • 2013-12-17
  • 2021-11-22
相关资源
最近更新 更多