Django 视图打开不同的内容

Posted

技术标签:

【中文标题】Django 视图打开不同的内容【英文标题】:Django views opens different content 【发布时间】:2021-01-15 04:58:55 【问题描述】:

我是 Django 新手。我创建了 2 个单独的视图和 URL,但是,当我加载我的开发服务器并单击幻灯片以打开 slides_detail.html 时,它会打开 sub_detail.html,此时我不知道是什么原因导致的,因为没有类似的名称这将导致打开完全不同的详细信息页面。幻灯片和子内容都位于同一个 HTML 文档中,与 URL 和视图相同。没有错误,可以显示。提前致谢:

网址:

    path('<int:sub_id>/', views.sub_detail, name='sub_detail'),
    path('<int:slides_id>/', views.slides_detail, name='slides_detail'),

观看次数:

    # Will show specific sub content details
    def sub_detail(request, sub_id):
       subcontent = get_object_or_404(SubContent, pk=sub_id)
       context = 
        'subcontent': subcontent,
       
    return render(request, 'home/sub_detail.html', context)


    # Will show specific slides content details
    def slides_detail(request, slides_id):
       slides = Slides.objects.get(pk=slides_id)
       context = 
        'slides': slides,
       
    return render(request, 'home/slides_detail.html', context)

幻灯片的 HTML:

                     % for slides in slides %
                        <div class="swiper-slide">
                            <div class="card">
                            <a href="% url 'slides_detail' slides.id %">
                            <img src=" slides.image.url " class="card-img-top img-height" ></a>
                            <div class="card-body bg-dark">
                                
                                <h5 class="card-title text-light font-weight-bold text-center"> slides.title </h5>
                            </div>
                            </div>
                        </div>
                    % endfor %

子内容的 HTML:

      % for sub in subcontent %
        % if forloop.counter|divisibleby:2 %
        <div class="row">
            % if sub.image %
                <div class="col-md-6 section-index-img">
                    <img src=" sub.image.url " class="rounded img-fluid" />
                </div>
            % endif %
            <div class="col-md-6">
            <a href="% url 'sub_detail' sub.id %">
                <h4> sub.title </h4>
            </a>
                <p class="text-muted"> sub.description | linebreaks </p>
            </div>
        </div>
        % else %

【问题讨论】:

模板重叠,因此路径/2 将触发第一个匹配的视图,在本例中为sub_detail 我需要为此更改视图或 URL 吗? 您需要为每个网址添加前缀或后缀,以便它匹配您想要的一种情况。如果您有 sub_id == 1 的记录和 slide_id == 1 的记录,则 url /1/ 将匹配列表中的第一个。改为调用这些/sub/&lt;int:pk&gt;//slide/&lt;int:pk&gt;/,问题就消失了。 谢谢,但是当我这样做时,它给了我 404,但是,当我从 /sub// 中删除第一个 / 时,离开 sub// 它可以工作完美。再次感谢您。你知道我怎样才能找到这方面的文档以了解更多信息吗? 【参考方案1】:

我已经创建了 2 个单独 视图和 URL,但是,当我加载我的开发服务器并单击幻灯片以打开 slides_detail.html 时,它会打开 sub_detail.html

您没有创建两个单独的 URL,而是创建了相同的路径。两条路径将以相同的模式触发。这意味着如果你有一个% url 'slides_detail' 42 %,例如,它将被写为/42,但这也是sub_detail的有效路径,所以当你使用该路径发出请求时,Django会“ fire" 第一个匹配的视图,在本例中为 sub_detail

您应该使路径不重叠,例如:

path('sub/<int:sub_id>/', views.sub_detail, name='sub_detail'),
path('slide/<int:slides_id>/', views.slides_detail, name='slides_detail'),

【讨论】:

以上是关于Django 视图打开不同的内容的主要内容,如果未能解决你的问题,请参考以下文章

第二章--django--URL和视图函数

Django:如何将相同的功能扩展到多个视图?

Django 调试视图,用于管理员的生产环境

django关闭调试信息,打开内置错误视图

Django 1.8_视图和URL配置

在基于 django rest 类的视图中允许不同类型的用户使用不同的视图