Не удается найти представления при использовании слагов и представлений на основе классов - PullRequest
2 голосов
/ 03 ноября 2019

В одном из моих приложений Django «Страницы» есть много разных классов в models.py. У каждого из них есть свой атрибут / поле slug. Я могу загрузить URL для первого - «company» (первый класс), но по какой-то причине не могу загрузить другие 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.

Факт: ниже 404 получено, когда я ввожу URL для отрасли или подотрасли. Это как будто ищет слаг только в просмотре компании.

Страница не найдена (404) Метод запроса: GET URL запроса: http://127.0.0.1:8000/business/construction/ Поднято: pages.views.CompanyDetailView Не найдено подходящей компаниизапрос

1 Ответ

1 голос
/ 03 ноября 2019

Это потому, что django оценивает URL-адреса в порядке их размещения в urlpatterns. Он получает запрос к предприятиям / строительству и вызывает CompanyDetailView, который возвращает значение 404. Для каждой модели требуется отдельный шаблон 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'),
]
...