使用 Django 生成的 slug URL 链接到特定页面

Posted

技术标签:

【中文标题】使用 Django 生成的 slug URL 链接到特定页面【英文标题】:Using a Django generated slug URL to link to specific pages 【发布时间】:2021-10-11 15:32:54 【问题描述】:

您好 Stack Overflow 的慷慨善良的人们。我对 Python 和 Django 还很陌生,并且已经承担了为我的文案构建作品集的项目。

我有一个主登录页面,其中包含 9 个不同的写作项目。有人会点击一个项目的图片,然后被带到一个新页面,该页面有更详细的项目描述。

每个单独的项目页面都有一个 URL,其路径包含一个 slug。我的代码可用于生成此路径。每个写作项目都会有一个包含 projects/(slug) 的 URL 路径

我的问题是我无法获得这个基于 slug 的链接,该链接将指向每个单独的页面以在我的代码中工作。我收到此错误:NoReverseMatch at / 未找到“individual_project”的反向。 “individual_project”不是有效的视图函数或模式名称。

请原谅我对这段代码的任何怀疑,因为我在理解这一切方面有点吃力。

这是我的views.py:

from django.shortcuts import render, get_object_or_404, get_list_or_404
from .models import Project

def individual_project_view(request, project_id):
     projectpage = get_list_or_404(Project, slug=project_id) 
     return render(request, 'projects/project_detail.html', 'projectpage':projectpage)

def project_home(request):
     portfolioprojects = get_list_or_404(Project)
     return render(request, 'projects/project_detail.html', 'portfolioprojects':portfolioprojects)

这是我的 urls.py:

from django.urls import path, include
from projects import views
app_name = 'portfolio'

urlpatterns = [path('<slug:project_id>', views.individual_project_view, name='individual_project'),]

最后是我的 HTML:

<a href="% url 'individual_project' %">
<img src=" project.image.url " class="img-fluid mb-2"></a>
% endif %
<div>
<h2 class= "category"> project.category </h2>
<h3 class="client"> project.description </h3>
<h4 class="project_type"> project.title </h4>
</div>

感谢阅读 - 非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

你有两个选择:

<a href="% url 'individual_project' project.slug %">

或者你使用 django 的“反向”方法。在您的班级模型中:

from django.urls import reverse

# this method called automaticallly by django. we are manuallly calling it here
  def get_absolute_url(self):
    # u create url only here and then reference here throughout of your project
    return reverse("individual_project",args=[self.slug])

在您的模板中:

 # looks like instance_of_model is project.
 # we are not hardcoding the url, passing a reference
  <a href="project.get_absolute_url">   </a>

【讨论】:

这让我接近了!这就是问题所在。我有两个应用程序。我有一个名为 Portfolio 的主登录页面,它有自己的 models.py。这有投资组合图像的字段和文本字段。这将填写我的 home.html 模板中的信息。我有第二个名为 Project 的应用程序,用于项目详细信息页面。它有自己的关联模型。这有关于项目的所有更长的信息,以及蛞蝓。您的解决方案在这里生成了正确的链接。但不需要它。我需要将 Projects w/ slug 中的类放入 Portfolio 的视图中。感谢您的帮助!【参考方案2】:

要正确地按名称反转路径,您不仅应该提供名称,还应该提供为该路径定义的参数。所以在这种情况下使用 % url % 的正确方法是

<a href="% url 'individual_project' project.slug %">

【讨论】:

感谢您帮助 Alexey,非常感谢!【参考方案3】:

您需要在 % url … % template tag [Django-doc] 中为 slug 添加一个表达式:

&lt;a href="% url '<b>portfolio:</b>individual_project' <strong>project.slug</strong> %"&gt;

由于您在urls.py 中定义了app_name,因此您需要为其添加前缀app_name,因此<b>portfolio:</b>individual_project 而不是individual_project

【讨论】:

@JeffCardello:你有“根”urls.py吗? @JeffCardello:如果你用path('projects/', include('projects.urls', name='portfolio') 导入它会怎样? 你好威廉。我在我的根 urls.py 中使用了这个路径。我现在收到此错误 - 当我引用 URL 时,似乎没有包含实际的 slug。我得到的错误是: NoReverseMatch at / Reverse for 'individual_project' with arguments '('',)' not found。尝试了 1 种模式:['projects/(?P[-a-zA-Z0-9_]+)/$'] 你知道我还需要检查什么吗? @JeffCardello:这意味着project 在您编写% url ... % 的位置不存在。鉴于您在 project 所在的 范围 中,您只能使用 project.pk 好的 - 这是有道理的,当我将其更改为 project.pk 时,当我将鼠标悬停在每个项目上时,我确实会获得以唯一整数结尾的链接。看到这种情况发生真是太酷了。我看过一些关于 get_absolute_url 的帖子。这会是更好的处理方式吗?再次感谢!

以上是关于使用 Django 生成的 slug URL 链接到特定页面的主要内容,如果未能解决你的问题,请参考以下文章

Django中的“slu”是什么?

如何在 Django 中使用反向工作来制作 *** 样式的 URL,以允许 slug 更改?

django 1.6:创建 slug url

用于生成 slug 的 Java 代码/库(用于漂亮的 URL)

Django:使用重复的 slug 管理诸如 id:slug 之类的 url

如何将 slug 添加到 asp.net 核心网站中的所有链接生成?