如何正确使用 % include % 标签在 django 中呈现模板(如部分)?

Posted

技术标签:

【中文标题】如何正确使用 % include % 标签在 django 中呈现模板(如部分)?【英文标题】:how to properly use % include % tag to render a template (like partials) in django?如何正确使用 % include % 标签在 django 中呈现模板(如部分)? 【发布时间】:2016-03-31 05:00:58 【问题描述】:

我在左侧有一个显示我的子类别的链接列表。我想要发生的是当用户点击一个子类别时,它会将数据/内容呈现到右侧。

我使用的是基于类的视图,所以我的初始页面是一个显示所有子类别对象的 ListView (subcategory_list.html)。

所以每个 Subcategory 对象都有一个 DetailView (subcategory_detail.html)。

我想根据单击的子类别链接显示 DetailView 模板(在同一页面上)。

如果我理解正确,我将不得不使用 % include % 标签和一些 AJAX ???

如何阻止浏览器转到新 URL??

谢谢!

views.py

class SubcategoryListView(ListView):
model = Subcategory
template_name = 'categories/subcategory_list.html'

class SubcategoryDetailView(DetailView):
model = Subcategory
template_name = 'categories/subcategory_detail.html'

def get_context_data(self, **kwargs):
    context = super(SubcategoryDetailView, self).get_context_data(**kwargs)
    context['tasks'] = Task.objects.filter(subcategory=self.object)
    context['contractors'] = ContractorProfile.objects.filter(subcategory=self.object)
    return context

subcategory_list.html

% extends 'base.html' %

% block content %
<div class="container">
    <div class="col-md-3">
        % for subcategory in object_list %
            <p><a href="% url 'categories:subcategory' subcategory.id %"> subcategory.title </a></p>

        % endfor %
    </div>
    <div class="col-md-9">
        % include 'categories/subcategory_detail.html' %
    </div>
</div>

% endblock %

subcategory_detail.html

% extends 'base.html' %

% block content %
<div class="container">
    <h3>Subcategory:  object.title </h3>

    % if user.is_authenticated%
        <div class="row">
            % for task in tasks %
            <div class="thumbnail col-md-3">
                <img src="#" class="img-circle" />
                <div class="caption">
                    <p>Title:  task.title </p>
                    <p>Description:  task.description </p>
                    <p>Special Instructions:  task.special_instructions </p>
                    <p>Posted by:  task.user.username </p>
                </div>
            </div>
            % cycle '' '' '' '</div><div class="row">' %
            % endfor %

    % endif %
    </div>

</div>
<div class="container">
    <h3>Contractors Available:</h3>
    <div class="row">
        % for contractor in contractors %
        <div class="thumbnail col-md-3">
            <img src="#" class="img-circle" />
            <div class="caption">
                <p>Name:  contractor.contractor.username </p>
                <p>Rating:  contractor.rating </p>
                % if contractor.contractor.is_online == True %
                    <span class="glyphicon glyphicon-fire"></span> <span>Online Now</span>
                % endif %
            </div>
        </div>
        % cycle '' '' '' '</div><div class="row">' %
        % endfor %
</div>



% endblock %

urls.py

urlpatterns = [
    url(r'^subcategories/$', views.SubcategoryListView.as_view(), name='subcategories'),
    url(r'^subcategories/(?P<pk>\d+)/$', views.SubcategoryDetailView.as_view(), name='subcategory'),
]

【问题讨论】:

如果没有 javascript 或重新加载页面,就无法做到这一点。如果你想要第一个解决方案,你应该提供描述你迄今为止尝试过的代码:你不能指望任何人为你编写整个 JavaScript 行为。 不查找整个代码。只是朝着正确的方向轻推。 是的。所以我可以将它设置为所有链接都获得#id,然后传递一个唯一的数据属性。然后将 % include 'template_name.html' % 标记附加到特定的 。但我的担忧/问题是系统在加载哪个 DetailView 之间会有什么不同(即 Subcategory1 与 Subcategory2 DetailView)? 我的回答只涉及它的 JS 方面。这是 Django 的责任:让我更新答案以涵盖这个问题。 其实这应该不是问题。 self.object 应该已经包含 Subcategory 对象。尝试打开“youwebsite/subcategories/0”(考虑到数据库中至少有一个 Subcategory 对象)。它呈现正确的吗?如果是,您的最后一个问题已经解决。 【参考方案1】:

所有不是通过刷新页面而是需要服务器内容来完成的,都需要使用 JavaScript。在这种情况下,您希望将 HTML 内容(由 Django 提供)注入到您的页面中。

我将在这里使用 jQuery。

首先,您要识别需要注入内容的 div(以便 JavaScript 能够引用它)和 div。

另外,删除% include % 标签(或者让标签呈现您想要在用户加载页面时呈现的内容)。

(在subcategory_list.html(应该改名为subcategory.html)):

<div class="container subcategory_list">
    <div class="col-md-3">
        % for subcategory in object_list %
            <p><a href="% url 'categories:subcategory' subcategory.id %"> subcategory.title </a></p>

        % endfor %
    </div>
    <div class="col-md-9" id="subcategory_detail">
        % include 'categories/subcategory_detail.html' %
    </div>
</div>

然后你需要告诉a href不要加载页面,而是让ajax调用发生。

<script type="text/javascript">
    $(function()  // shortcut for onDocumentReady

        // When you click an "a" tag who is child of an item with class "subcategory_list"…
        $('.subcategory_list>a').click(function() 

            var href = $(this).attr('href');

            // Use this if you want to add a loading gif or something similar
            // $('#subcategory_detail').html(my_cool_loading_gif_html)

            $.get(href, 
                success: function(response) 
                    // If the ajax call is successful, take the response and inject in div with id "subcategory_detail"
                    $('#subcategory_detail').html(response)
                ,
                error: function(response) 
                    // Handle ajax errors here
                
            )
            return false;
        );

    );
</script>

【讨论】:

嗯..它只是将我带到子类别详细信息页面,即使使用'return false;'最后 代码正在运行:jsfiddle.net/Saturnix/w7L821vo/3 你检查过你的 JS 控制台了吗?您是否尝试过使用 console.log() 进行调试? jQuery 是否正确包含? 好的。 return false 现在正在工作。我能够在 $.getsuccess: 中获得“href”值。但是“响应”=未定义。这意味着它实际上并没有从特定的 url 获取数据,对吗? 我必须将数据序列化为 JSON 吗? 绝对不是:您应该返回 HTML 代码,而不是 JSON。我不明白为什么响应对象是空的。能不能在success函数里放一个console.log(response),看看得到了什么?

以上是关于如何正确使用 % include % 标签在 django 中呈现模板(如部分)?的主要内容,如果未能解决你的问题,请参考以下文章

前端,DJ

如何开始使用 dj-stripe 1.0?

[bzoj1077]天平

Floyd模板

怎么把一首自己喜欢的普通歌曲变成DJ 混合DJ?

无法使用 % url % 模板标签正确生成带有捕获参数的 URL