【问题标题】:Django not displaying two DetailViewDjango不显示两个DetailView
【发布时间】:2020-04-30 03:40:33
【问题描述】:

每当我点击 index.html 中的 job_title 链接时,django 都会将我重定向到 detail 网址并从那里重定向到 views.py 文件中的 DetailView,最后打开 detail.html 文件。 我正在为 category 链接做同样的事情。但它给了我一个错误:找不到与查询匹配的工作。 (页面未找到提出者:JobPanel.views.DetailView)。我正在从数据库中获取正确的 slug 到 index.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)

【问题讨论】:

  • 两种模式完全重叠,因此总是会触发第一个视图。

标签: python django


【解决方案1】:

简答:制作非重叠模式。

您定义的两个模式完全重叠。实际上,如果您有一个带有/some-category-slug 的网址,那么该网址将匹配&lt;slug:detail_slug&gt;/ 模式,从而触发第一个视图。另一个 path 也匹配的事实无关紧要,因为 Django 总是会触发列表中匹配的第一个视图。

解决这个问题的最佳方法是制作非重叠模式,例如:

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

如果您现在为一个类别生成一个 url,它将看起来像 category/my-category-slug。这不能与第一个path(..) 匹配,因为这要求路径以detail 开头。反之亦然。

请注意,您忘记正确设置CategoryViewmodel,它可能应该是:

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

【讨论】:

  • 我更改了网址格式。 path('detail//', DetailView.as_view(), name='detail'), path('category//', CategoryView.as_view(), name='category' )但我仍然收到类别错误。但这次是 CategoryView 引发的错误。
  • @Hussam_7102:您没有更改CategoryView 的型号。
【解决方案2】:

您像这样定义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,这似乎是错误的。

您遗漏了创建JobCategory 之间关系的代码。由于您的模板代码中有job.categories,这似乎是一对多的关系。

在这种情况下,您的 CategoryView 应该:

  • 子类ListView,保留model = Job并使用slug_field=category__slug
  • 或子类DetailView,使用model=Category,其余部分保持原样

编辑:

Willem 关于重叠 URL 的观点当然是这里的另一个问题。

如果您需要没有嵌套路径的 URL(/:slug/ 而不是 /job/:slug/) - 您也可以使用像 /job-:slug/ 这样的模式。

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 2021-03-24
    • 2014-07-27
    • 2016-03-23
    • 2012-04-19
    • 1970-01-01
    • 2015-03-15
    • 2014-05-25
    • 2017-12-12
    相关资源
    最近更新 更多