使用列表和详情通用视图填充模板
我正在创建一个用户列表,这些用户的信息存储在我的数据库里,并通过一个叫 user_list.html 的模板显示出来。我使用了一些通用视图来实现这个功能。不过,我的模型从其他类继承了很多属性。现在我想要的是,当用户点击自己的名字时,能够跳转到 user_detail.html 页面,并在这里看到自己的详细信息。
这些详细信息需要从数据库中获取,实际上就是从同一个模型中提取数据,这个模型已经定义了查询集。
我的 views.py 文件看起来是这样的:
from django.contrib.auth.models import User
from django.shortcuts import render_to_response, get_object_or_404
from django.views.generic.list_detail import object_list, object_detail
from contacts.models import *
def employee_list(request, queryset=None, **kwargs):
if queryset is None:
queryset = Employee.objects.all()
return object_list(
request,
queryset=queryset,
paginate_by=20,
**kwargs)
def employee_detail(request, employee_id):
return object_detail(
request,
queryset= Employee.objects.all(),
# extra_context ={"EC_list": EmergencyContact.objects.all()},
object_id=employee_id)
urls.py 文件:
from contacts.views import employees
urlpatterns = patterns('',
url(r'^$',
employees.employee_list,
name='contacts_employee_list'),
url(r'^(?P<employee_id>\d+)/$',
employees.employee_detail,
name='contacts_employee_detail'),
我的 employee_detail.html 文件看起来是这样的:
{% block title %} Employee details {% endblock %}
{% block heading1%}<h1> Employee's Details </h1>{% endblock %}
{% block right_menu %}
{% if object %}
<ul>
<li> Name:{{ object.full_name }}</li>
<li> Contact No.: {{ object.phone_number }}</li>
<!-- <li> Refrence Contact No.: {{ EC_list.contact }}</li> -->
<li> Blood Group: {{ object.blood_type }}</li>
<li> Martial Status: {{ object.martial_status }}</li>
<li> Nationality: {{ object.about }}</li>
<!-- <li> Relationship: {{ EC_list.relationship }}</li>
<li>Course: {{ object.course }}</li> -->
</ul>
{% else %}
No Registered user present.
{% endif %}
{% endblock %}
所以请帮我想想,怎么才能显示出员工在其他模型中的所有数据。谢谢!
1 个回答
如果我理解得没错,你想显示关于员工的信息,而这些信息存储在其他模型里。
我猜你知道可以在视图中提前过滤数据,并发送一个额外的上下文变量,里面包含查询集。你现在的代码 extra_context ="EC_list": EmergencyContact.objects.all()
选择的数据太多了。我猜你的 EmergencyContact 模型里有一个指向 Employee 的外键(employee = ForeignKey(Employee, related_name='emergency_contacts')
)。在这种情况下,你需要传递经过过滤的额外上下文。
def employee_detail(request, employee_id):
return object_detail(
request,
queryset= Employee.objects.all(),
extra_context ={"EC_list": EmergencyContact.objects.filter(employee__pk=employee_id)},
object_id=employee_id)
这样可以把列表过滤到你需要的紧急联系人。
{% block title %} Employee details {% endblock %}
{% block heading1%}<h1> Employee's Details </h1>{% endblock %}
{% block right_menu %}
{% if object %}
<ul>
<li> Name:{{ object.full_name }}</li>
<li> Contact No.: {{ object.phone_number }}</li>
<li> Blood Group: {{ object.blood_type }}</li>
<li> Martial Status: {{ object.martial_status }}</li>
<li> Nationality: {{ object.about }}</li>
<li> Course: {{ object.course }}</li>
<li> Emergency Contacts:
<ul>
{% for EC in EC_list %}
<li> Name: {{ EC.name }} </li>
<li> Contact No.: {{ EC.contact }}</li>
<li> Relationship: {{ EC.relationship }}</li>
{% endfor %}
</ul>
</li>
</ul>
{% else %}
No Registered user present.
{% endif %}
{% endblock %}
当然,这只是其中一种方法。如果你不需要对紧急联系人进行复杂的过滤,可以在模板中使用外键反向查找。也就是说,可以去掉 EC_list 的 extra_context,把联系人渲染的函数换成这个:
<li> Emergency Contacts:
<ul>
{% for EC in object.emergency_contacts %}
<li> Name: {{ EC.name }} </li>
<li> Contact No.: {{ EC.contact }}</li>
<li> Relationship: {{ EC.relationship }}</li>
{% endfor %}
</ul>
</li>
记住,我们在 EmergencyContact 到 Employee 的外键中有 employee = ForeignKey(Employee, related_name='emergency_contacts')
。这个声明不仅在 EmergencyContact 中添加了员工字段,还在 Employee 中添加了一个额外的 虚拟 字段,名字叫 'emergency_contacts'。这个虚拟字段会返回所有与当前员工关联的紧急联系人的查询集。
如果你有任何问题或者需要文档链接,随时告诉我。
编辑:为了提高可读性,考虑设置通用视图的 template_object_name 参数。
def employee_detail(request, employee_id):
return object_detail(request, queryset= Employee.objects.all(),
object_id=employee_id, template_object_name='employee')
------------------------------------------------------------------------------------------
<li> Name: {{ employee.full_name }}</li>
<li> Emergency Contacts:
<ul>
{% for EC in employee.emergency_contacts %}
<li> Name: {{ EC.name }} </li>
<li> Contact No.: {{ EC.contact }}</li>
<li> Relationship: {{ EC.relationship }}</li>
{% endfor %}
</ul>
</li>