首页 > 解决方案 > 使用 Django slug,出现无反向路径错误

问题描述

如果您已经阅读了我之前关于 Django slug 问题的帖子,我深表歉意。我清理了我的旧代码,也许对我在做什么有了更好的理解,但我仍然不知道如何让一个从 slug 生成的 URL 在我的主登录页面上工作。

我正在做一个投资组合。我有一个登录页面,我将在其中链接到各个详细信息页面。我在我的模型中使用 get_absolute_url 来做到这一点。对此进行测试时,我可以在单个项目详细信息页面上获取链接,但不能在主要登录页面上使用。这很有趣,因为我不需要这些链接来处理单个项目页面。我的猜测是我认为某些东西设置不正确。

我的views.py 是这样设置的:

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



def home(request):
    projects = Project.objects.all()
    return render(request, 'portfolio/home.html', {'projects': projects})

def individual_project_view(request, project_id):

    projectpage = get_list_or_404(Project, slug=project_id)
    return render(request, 'portfolio/project_detail.html',{'projectpage':projectpage})


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

这是我的各个登陆页面的 urls.py,它们位于单独的应用程序中。

from django.urls import path, include
from . import views



app_name = 'portfolio'

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

根文件夹中的 urls.py 设置如下:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
from portfolio import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('portfolio/', include('portfolio.urls'), name='portfolio'),



    ]

我的 models.py 是这样设置的:

from django.db import models
from django.urls import reverse

# Create your models here.

class Project(models.Model):
    category = models.CharField(max_length=75, blank=True)
    project_name = models.CharField(max_length=100)
    company = models.CharField(max_length=250)
    image = models.ImageField(upload_to='portfolio/images/')

    client = models.CharField(max_length = 30, blank=True)
    type = models.CharField(max_length = 80, blank=True)
    slug = models.SlugField(max_length=50, blank=True)
    description = models.TextField( blank=True)
    testimonial = models.TextField(blank=True)
    featuredimage = models.ImageField(upload_to='portfolio/images/', blank=True)
    type2 = models.CharField(max_length = 80, blank=True)
    description2 = models.TextField(blank=True)
    featuredimage2 = models.ImageField(upload_to='portfolio/images/', blank=True)
    url = models.URLField(blank=True)
    url2 = models.URLField(blank=True)
    testimonial2 = models.TextField(blank=True)
    projecturl = models.URLField(blank=True)
    projecturl2 = models.URLField(blank=True)

    def get_absolute_url(self):
    # u create url only here and then reference here throughout of your project
        return reverse('portfolio:individual_project',args=[self.slug])



    def __str__ (self):

        return self.project_name

我尝试访问此链接的主登录页面的 HTML 如下:

  {% for project in projects %}

  <div class="col-lg-4 col-md-6  padding_top">

    {% if project.url %}
    <a href="{{ project.url }}">
      <img src="{{ project.image.url }}" class="img-fluid  mb-2">

    </a>
    {% else %}


    <a href="{% url 'individual_project' project.slug %}">
    <img src="{{ project.image.url }}" class="img-fluid mb-2">
    </a>

当我尝试访问此模板时,我收到以下错误:

" NoReverseMatch at / Reverse for 'individual_project' 未找到。'individual_project' 不是有效的视图函数或模式名称。"

真正让我困惑的是,当我尝试这种方式时,它<a href="{{project.get_absolute_url}}">适用于项目详细信息模板,该模板以 home.html 为首,{% for content in projectpage %}但不在具有代码的 home.html 上{% for project in projects %}

感谢您的帮助!

标签: djangodjango-modelsdjango-viewsdjango-templates

解决方案


推荐阅读