【问题标题】:Using a Django generated slug URL to link to specific pages使用 Django 生成的 slug URL 链接到特定页面
【发布时间】: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>

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

【问题讨论】:

    标签: python django slug


    【解决方案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 的帖子。这会是更好的处理方式吗?再次感谢!
    猜你喜欢
    • 2017-05-08
    • 2015-04-19
    • 2013-02-11
    • 1970-01-01
    • 2021-05-04
    • 2011-09-02
    • 1970-01-01
    • 2023-01-09
    • 2013-06-07
    相关资源
    最近更新 更多