2016-08-14 70 views
0

之前,通用視圖我有以下看法:附加額外的值在Django查詢集遞給模板

class AppointmentListView(LoginRequiredMixin, ListView): 

    queryset = Appointment.objects.prefetch_related('client','patients') 

我需要能夠以一個額外的變量添加到每個基於以下返回約會對象:

status_choices={ 
    'STATUS_UPCOMING':'default', 
    'STATUS_ARRIVED':'primary', 
    'STATUS_IN_CONSULT': 'success', 
    'STATUS_WAITING_TO_PAY':'info', 
    'STATUS_PAYMENT_COMPLETE':'warning', 
} 

的值(「默認」,「主要」等)對應於我想根據預約的類型使用標準的CSS classesin訓練營主題。例如,'默認'會產生一個灰色的按鈕,'警告'一個紅色的按鈕等。

我需要根據記錄的狀態映射每個約會記錄到某個css按鈕('即將到來'將顯示'默認'類等)。

我的初始想法是遍歷設置查詢並建立一個單獨的陣列/字典約會PK映射到給定的CSS類如 1:'success', 2:'warning',再通,在作爲上下文變量。

但我想知道是否可以直接將值添加到每個Appointment對象(可能將查詢集保存爲列表?)這將是一個更清潔的解決方案,但我不知道應該如何接近。

任何想法非常讚賞

回答

1

你應該重載的ListView的get_queryset方法,像這樣

def get_queryset(self, **kwargs): 
    queryset = super(AppointmentListView, self).get_queryset(**kwargs) 
    # Add new elements here 
    ... 
    return queryset 
+0

感謝。我將如何去更新查詢集中的每個對象?例如,將'css_class ='warning''僅添加到滿足該要求的對象。 –

+0

您可能正在創建自定義表單類型,並在字段類型上重載'render_options'方法。但事實上,這是一個單獨的問題,可能不應該在這裏的評論部分詢問 – nkhumphreys

+0

聽起來像我第一次問到的問題:如何在queryset返回到模板之前向每個Appointment對象添加值。 所以沒有簡單的方法來'攔截'查詢集並修改它? –

0

我通過在數據庫覆蓋get_queryset(),並給予對象(即每行得到了這個工作)額外的即時鍵/值:

class AppointmentListView(LoginRequiredMixin,ListView): 
    #friendly template context 
    context_object_name = 'appointments' 
    template_name = 'appointments/appointment_list.html' 

    def get_queryset(self): 
     qs = Appointment.objects.prefetch_related('client','patients') 
     for r in qs: 
      if r.status == r.STATUS_UPCOMING: r.css_button_class = 'default' 
      if r.status == r.STATUS_ARRIVED: r.css_button_class = 'warning' 
      if r.status == r.STATUS_IN_CONSULT: r.css_button_class = 'success' 
      if r.status == r.STATUS_WAITING_TO_PAY: r.css_button_class = 'danger' 
      if r.status == r.STATUS_PAYMENT_COMPLETE: r.css_button_class = 'info' 
     return list(qs) 

幾件事情:

  1. 我將查詢集qs轉換爲列表以「凍結」它。這樣可以防止對查詢集進行重新評估(例如切片),這又會導致在從數據庫中提取新數據時,即時模型更改會丟失。

  2. 我需要明確地指定一個值給template_name。重寫get_queryset時,模板名稱不是自動生成的。作爲比較,下面的代碼,其queryset屬性設置,自動生成模板名稱:

    class AppointmentListView(LoginRequiredMixin, ListView): 
        queryset = Appointment.objects.prefetch_related('client', 'patients') 
        #template name FOO_list derived automatically 
    
    #appointments/views.py 
    ... 
    #can use derived name (FOO_list) 
    {% for appointment in appointment_list %} 
    ...