使用列表,详细通用视图填充模板

时间:2010-11-25 07:36:01

标签: python django views generics

我正在创建一个存在于我的数据库中的用户列表,它们通过使用通用视图显示在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_deatil.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 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望显示有关存储在其他模型中的员工的信息。

我假设您知道可以在视图中预过滤并使用查询集发送额外的上下文变量。使用现有行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>

请记住,我们将employee = ForeignKey(Employee, related_name='emergency_contacts')作为从EmergencyContact到Employee的外键。此声明不仅会将员工字段添加到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>