Django не отображаются два DetailView - PullRequest
1 голос
/ 13 января 2020

Каждый раз, когда я нажимаю на ссылку job_title в index. html, django перенаправляет меня на detail url и оттуда перенаправляет на DetailView в views.py файле и, наконец, он открывает detail. html файл. То же самое я делаю для ссылки category . Но это дает мне ошибку: Не найдено ни одной работы, соответствующей запросу . (Страница не найдена Поднято: JobPanel.views.DetailView ). Я получаю правильных слагов из базы данных для индексации. html.

urls.py

path('<slug:detail_slug>/', DetailView.as_view(), name='detail'),
path('<slug:cat_slug>/', CategoryView.as_view(), name='category'),

views.py

class DetailView(generic.DetailView):
    model = Job
    template_name = 'JobPanel/detail.html'
    slug_url_kwarg = 'detail_slug'
    slug_field = 'slug'

class CategoryView(generic.DetailView):
    model = Job
    template_name = 'JobPanel/category.html'
    slug_url_kwarg = 'cat_slug'
    slug_field = 'slug'

index. html

<a href="{% url 'jobpanel:detail' job.slug %}">{{ job.job_title }}</a>

<br>

{% for cat in job.categories.all %}
    <a href="{% url 'jobpanel:category' cat.slug %}">{{ cat }}</a>
{% endfor %}

models.py

class Category(models.Model):

    category = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.category

class Job(models.Model):

    job_title = models.CharField(max_length=250)
    job_description = models.TextField()
    slug = models.SlugField(unique=True)

Ответы [ 2 ]

1 голос
/ 13 января 2020

Вы определяете CategoryView следующим образом:

class CategoryView(generic.DetailView):
    model = Job
    template_name = 'JobPanel/category.html'
    slug_url_kwarg = 'cat_slug'
    slug_field = 'slug'

, который будет искать следующее:

Job.objects.get(slug=cat_slug)

Глядя на ваши модели, это кажется неправильным, если предполагается cat_slug указывать на job.categories.slug вместо job.slug.

Вы пропустили код, который создает связь между Job и Category. Кажется, это отношение 1-ко-многим из-за job.categories в коде вашего шаблона.

В этом случае ваш CategoryView должен либо:

  • подкласс ListView, сохраняя model = Job и используя slug_field=category__slug
  • или подкласс DetailView, используя model=Category, оставляя остаток как есть

РЕДАКТИРОВАТЬ:

Точка наложения перекрывающихся URL Виллема, конечно, является здесь другой проблемой.

Если вам нужны URL без вложенных путей (/:slug/ вместо /job/:slug/) - вы также можете использовать шаблон, например /job-:slug/.

1 голос
/ 13 января 2020

Короткий ответ : сделать непересекающимися шаблонами.

Два определенных вами шаблона полностью перекрываются. Действительно, если у вас есть URL с /some-category-slug, то этот URL будет соответствовать шаблону <slug:detail_slug>/ и, таким образом, будет запускать первое представление. Тот факт, что другой path также совпадает, не имеет значения, поскольку Django всегда будет запускать первое представление в списке, который соответствует.

Лучший способ решить эту проблему - сделать непересекающимся шаблоны, например:

path('<b>detail/</b><slug:detail_slug>/', DetailView.as_view(), name='detail'),
path('<b>category/</b><slug:cat_slug>/', CategoryView.as_view(), name='category'),

Если вы сейчас создадите URL для категории, он будет выглядеть как category/my-category-slug. Это может не совпадать с первым path(..), поскольку для этого требуется, чтобы путь начинался с detail. Также верно и обратное.

Обратите внимание, что вы забыли правильно установить model вашего CategoryView, вероятно, оно должно быть:

class CategoryView(generic.DetailView):
    model = <b>Category</b>  # change to Category
    template_name = 'JobPanel/category.html'
    slug_url_kwarg = 'cat_slug'
    slug_field = 'slug'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...