使用 slug 和基于类的视图时找不到视图

Posted

技术标签:

【中文标题】使用 slug 和基于类的视图时找不到视图【英文标题】:Failing to find views when using slugs and class based views 【发布时间】:2020-02-28 17:53:05 【问题描述】:

我的一个 Django 应用程序“Pages”在 models.py 中有许多不同的类。他们每个人都有自己的 slug 属性/字段。我可以加载第一个“公司”(头等舱)的 URL,但由于某种原因无法加载其他 URL。

我尝试单独导入视图并为每个视图创建 url 路径。这样做时,只会加载最后一个 URL(第三个)。

models.py

class Industry(models.Model):
    industry = models.CharField(max_length=140, null=True, blank=True, unique=True)
    slug = models.SlugField(max_length=40, null=True, blank=True)
    def __str__(self):
        return self.industry
    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.industry)

            super(Industry, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('industry_detail', args=[(self.slug)])

class Subindustry(models.Model):
    subindustry = models.CharField(max_length=140, null=True, blank=True, unique=True)
    industry = models.ForeignKey(
        Industry,
        on_delete=models.CASCADE,
        related_name='ParentIndustry',
    )
    slug = models.SlugField(max_length=40, null=True, blank=True)
    def __str__(self):
        return self.subindustry
    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.subindustry)

            super(Subindustry, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('subindustry_detail', args=[(self.slug)])



class Company(models.Model):
    name = models.CharField(max_length=50, blank=False, unique=True, default=(str(id)))
    website = models.URLField(max_length=100)
    ...
    slug = models.SlugField(max_length=40, null=True, blank=True)
    def __str__(self):
        return self.name
    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.name)

            super(Company, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('company_detail', args=[(self.slug)])

views.py

from django.views.generic import DetailView
from django.urls import reverse_lazy

# Create your views here.
from .models import Company, Industry, Subindustry

class CompanyDetailView(DetailView):
    model = Company
    template_name = 'company_detail.html'
    slug_field = 'slug'

class IndustryDetailView(DetailView):
    model = Industry
    slug_field = 'slug'
    template_name = 'industry_detail.html'


class SubindustryDetailView(DetailView):
    model = Subindustry
    slug_field = 'slug'
    template_name = 'subindustry_detail.html'

urls.py(页面应用)

from django.urls import path

from .views import CompanyDetailView, IndustryDetailView, SubindustryDetailView

urlpatterns = [
     path('<slug:slug>/', CompanyDetailView.as_view(), name='company_detail'),
     path('<slug:slug>/', IndustryDetailView.as_view(), name='industry_detail'),
     path('<slug:slug>/', SubindustryDetailView.as_view(), name='subindustry_detail'),
]

urls.py(项目级)

from django.contrib import admin
from django.urls import path, include
from django.views.generic.base import TemplateView


urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/', include('users.urls')),
    path('users/', include('django.contrib.auth.urls')),
    path(r'aoa/', include('qa.urls')),
    path('business/', include('pages.urls')),
    path('', TemplateView.as_view(template_name='home.html'), name='home'),
]

预期:输入正确的 url 时看到页面。例如。如果我尝试加载http://127.0.0.1:8000/business/construction/,它将加载(例如,这是一个行业值)。目前只有公司值负载,例如http://127.0.0.1:8000/business/macrodepot/ 请注意,我确实有每个类的 HTML 模板,如果我在 views.py 文件中只有一个模板,我就能看到它们。

实际:当我输入行业或子行业的 url 时收到以下 404。好像只在 companydetailview 中寻找 slug。

找不到页面 (404) 请求方法:GET 请求网址:http://127.0.0.1:8000/business/construction/ 提出者:pages.views.CompanyDetailView 找不到与查询匹配的公司

【问题讨论】:

【参考方案1】:

这是因为 django 按照它们在 urlpatterns 中的放置顺序评估 url。它接收到企业/建筑的请求并调用返回 404 的 CompanyDetailView。您需要为每个模型设置不同的 url 模式:

    urlpatterns = [
     path('company/<slug:slug>/', CompanyDetailView.as_view(), name='company_detail'),
     path('industry/<slug:slug>/', IndustryDetailView.as_view(), name='industry_detail'),
     path('subindustry/<slug:slug>/', SubindustryDetailView.as_view(), name='subindustry_detail'),
]

【讨论】:

以上是关于使用 slug 和基于类的视图时找不到视图的主要内容,如果未能解决你的问题,请参考以下文章

部署到生产时找不到索引视图?

使用基于类的视图具有类别 slug 和 Post slug 的 URL

使用Android studio创建的AIDL编译时找不到自定义类的解决办法

基于 Django 类的通用视图和 ModelForms

为啥使用 Origin 标头时找不到路由

如何解决IDEA 中Java项目运行时找不到或无法加载到主类的问题