使用 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 添加一个表达式:
<a href="% url '<b>portfolio:</b>individual_project' <strong>project.slug</strong> %">
由于您在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/(?Pproject
在您编写% url ... %
的位置不存在。鉴于您在 project
所在的 范围 中,您只能使用 project.pk
。
好的 - 这是有道理的,当我将其更改为 project.pk 时,当我将鼠标悬停在每个项目上时,我确实会获得以唯一整数结尾的链接。看到这种情况发生真是太酷了。我看过一些关于 get_absolute_url 的帖子。这会是更好的处理方式吗?再次感谢!以上是关于使用 Django 生成的 slug URL 链接到特定页面的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django 中使用反向工作来制作 *** 样式的 URL,以允许 slug 更改?
用于生成 slug 的 Java 代码/库(用于漂亮的 URL)