2010-11-25 71 views
0

我正在創建一個用戶列表,顯示在我的數據庫中,它們通過使用通用視圖顯示在user_list.html模板中,但是我的模型繼承了其他類的許多屬性在模型中。現在我希望當用戶點擊他的名字時,他應該被重定向到user_detail.html頁面,他應該在這裏獲得他的詳細信息。 細節將從數據庫中提取,它只是從定義了queryset的同一模型中選取值。使用列表填充模板,詳細的通用視圖

我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 %} 

所以,請幫我弄清楚,怎麼能我顯示其他模型中存在的所有員工數據。謝謝!

+2

在代碼中包含行號並不是一個好主意。你應該刪除它們。 – pyfunc 2010-11-25 07:40:15

+0

你的問題是什麼?什麼目前不起作用?你期望看到什麼,你看到了什麼? – 2010-11-25 09:33:56

回答

0

如果我正確地理解了你,你想要顯示存儲在其他模型中的僱員信息。

我假設您知道您可以在視圖中進行預過濾並使用查詢集發送額外的上下文變量。使用您現有的線extra_context ="EC_list": EmergencyContact.objects.all()選擇太多。我假設您的EmergencyContact模型對僱員 (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 %} 

當然,這只是一種方法。如果您不需要緊急聯繫人上的任何奇特過濾器,則可以在模板中使用外鍵反向查找。即擺脫extra_context中用的EC_list,並與該更換的接觸渲染功能:

 <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到員工的外鍵。該聲明不僅將員工字段添加到EmergencyContact,而且還將額外的虛擬字段添加到名稱爲'emergency_contacts'的員工。此虛擬字段返回鏈接到當前員工的所有緊急聯繫人的查詢集。

讓我知道,如果您有任何疑問或需要的文檔鏈接

編輯:爲可讀性起見,considder設置通用視圖的參數的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>