【发布时间】: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 对象)。它呈现正确的吗?如果是,您的最后一个问题已经解决。
标签: python ajax django django-templates django-views