使用列表和详情通用视图填充模板

0 投票
1 回答
796 浏览
提问于 2025-04-16 07:35

我正在创建一个用户列表,这些用户的信息存储在我的数据库里,并通过一个叫 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 个回答

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>

记住,我们在 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>

撰写回答