【问题标题】:Populate templates using list,detail generic views使用列表填充模板,详细的通用视图
【发布时间】:2010-11-25 07:36:00
【问题描述】:

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

所以请帮助我弄清楚如何显示其他模型中存在的员工的所有数据。谢谢!

【问题讨论】:

  • 在代码中包含行号根本不是一个好主意。您应该删除它们。
  • 你的问题是什么?什么目前不起作用?您希望看到什么,而您又看到了什么?
  • 你好伙计,我想用数据库模型中可用的所有细节来填充我的模板。我的模型也有外键等关系,我无法显示与其他模型有外键关系的模型的那些属性。

标签: python django views generics


【解决方案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>

请记住,我们将 employee = ForeignKey(Employee, related_name='emergency_contacts') 作为从 EmergencyContact 到 Employee 的外键。此声明不仅将员工字段添加到 EmergencyContact,而且还添加了一个额外的 virtual 字段到名称为“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>

【讨论】:

  • 感谢您的精彩回答,它确实有效,,,,,,如果你能给我发一些这篇文章的相关链接,我将非常感谢你........ .
  • 你好亲爱的,现在我想显示本身是其他类的外键的属性,所以如何在我的模板中调用它们。示例:我有一个紧急联系人,它有一个属性 contact=models.ForeignKey (Person,verbose_name=_('contact'),related_name='emergency_contact_to') 但是这个类 Person 还有它的属性 phone_number 指向其他类,即 phone_number=generic.GenericRelation('PhoneNumber')。我无法访问电话号码。那么如何在模板中显示它。
  • 你能发布相关的模型定义吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2023-03-04
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多