【问题标题】:Django Navbar Categories Link IssuesDjango Navbar 类别链接问题
【发布时间】:2019-11-25 00:56:06
【问题描述】:

当我单击菜单中的类别链接时,出现以下错误。

找不到页面 (404)

请求方法:GET

请求网址:http://127.0.0.1:8000/post/categorylist/

提出者:post.views.post_detail

没有帖子匹配给定的查询。

models.py

def get_categorylist_url(self):
    return reverse('post:categorylist', kwargs={'slug': self.slug})

views.py

def post_categorylist(request, slug):

    if not request.user.is_superuser:
        raise Http404()

    post = get_object_or_404(Post, slug=slug)
    post.categorylist()
    return redirect('post:categorylist')

urls.py

path('categorylist/',views.post_categorylist, name='categorylist'),

header.html

<li><a href="{% url 'post:categorylist' %}">Kategoriler</a></li>

categorylist.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    Test message.
  </body>
</html>

【问题讨论】:

    标签: python django


    【解决方案1】:

    如果您的根 urls.py 与发布的一样,您应该转到 http://127.0.0.1:8000/categorylist/,因为这是 URL 链接到的路径。

    但是,您的视图中有一个slug,但它并没有由您的 URL 处理,因此您也可能在那里遇到问题。因为你的视图需要一个蛞蝓,试着改变你的视图来寻找它;

    path('categorylist/<slug:slug>/',views.post_categorylist, name='categorylist'),
    

    【讨论】:

    • 我有导航栏问题,我在 HomeViews 上下文中添加的 slug 不适用于其他视图,我该如何解决这个问题?我不想在所有其他视图上添加相同的上下文,有没有其他方法可以用 DRY 解决这个问题?
    • @DerekPK 如果您想要对所有视图都可用的东西,您应该考虑使用上下文处理器; betterprogramming.pub/…
    • 这看起来不错,但它一次只添加到一个应用程序,是否有可能制作其中一个并且每个应用程序都获得它们,或者我使用应用程序的方式是否错误?
    • 使用包含上下文处理器的设置文件将它添加到属于应用程序一部分的每个视图的上下文中。
    • @markwalker 我测试了它,似乎它已添加到所有应用程序中。正是我所希望的。我将其添加到 app1 中,然后转到 app2 中的模板,它的工作原理相同。
    【解决方案2】:

    您的错误由:post.views.post_detail 提出,因此您的网址错误。 您想要获取 slug 参数,但您的 url 没有任何 slug 参数。首先,您应该修复您的 url 路径。

    比,如果你想当用户点击 x 类别链接并获得 x 类别中的产品,让我们举个例子:

    首先创建这个视图:

    views.py:

    def category_list(request):
        # Category loops on index page.
        category_list = Category.objects.filter()
        context = {
    
            "category_list": category_list,
        }
        return context
    

    然后,我们应该将此上下文添加到我们的上下文处理器中以访问任何地方(因为它是导航栏,所以导航栏将位于每个页面的顶部,对吧?)

    settings.py:

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': ["templates"],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    ************************************,
                    'YOURMODELNAME.views.category_list',
                ],
            },
        },
    ]
    

    最后,您将访问项目中的所有类别,只需在模板中添加以下代码:

    navbar.html:

    {% for category in category_list %}
        <a href="{% url 'categories' slug=category.slug %}">
            {{ category.name }} <!--You can use ul-li for displaying them-->
        </a>
    {% endfor %}
    

    好的,我们显示了我们的类别,但是当用户点击任何链接时,应该重定向到点击类别中的过滤列表。所以我们应该为这个页面创建页面和链接:

    views.py:

    def category_list(request, slug):
        category = Category.objects.get(slug=slug)    
        posts = Post.objects.filter(category=category)
        context = {
            "posts": posts, #filtered products
        }
        return render(request, "posts_in_category.html", context)
    

    urls.py:

    path('category/<slug:slug>', views.category_list, name="category_list")
    

    posts_in_category.html:

    {% for post in posts_in_category %}
            {{ post.name }}
        {% endfor %}
    

    如果你错过了什么,我可以用土耳其语解释;)

    【讨论】:

      【解决方案3】:

      我正在使用此代码。如何添加链接?

      views.py

      def categorylist(request):
          # Category loops on index page.
          categorylist = Category.objects.filter()
          context = {
      
              "categorylist": categorylist,
          }
          return render(request, "post/categories.html", context)
      

      categories.html

      {% for post in categorylist %}
        {{ post.name }}
      {% endfor %}
      

      【讨论】:

        猜你喜欢
        • 2019-04-17
        • 2011-02-25
        • 1970-01-01
        • 2017-11-10
        • 1970-01-01
        • 1970-01-01
        • 2011-02-25
        • 1970-01-01
        • 2019-12-12
        相关资源
        最近更新 更多