2013-07-03 42 views
0

這是一個令人尷尬的簡單問題。我試圖瞭解如何在我正在構建的第一個Django應用程序中包含一個簡單的Python函數。這是我的views.py文件...如何在Django中編寫Python代碼

from django.shortcuts import render 
from noticeboard.models import Listings 
from django.views import generic 
from django.template import Context 

class IndexView(generic.ListView): 
    template_name = 'listings/index.html' 
    context_object_name = 'latest_listings' 

    def get_queryset(self): 
     return Listings.objects.order_by('-pub_date') 

class DetailView(generic.DetailView): 
    model = Listings 
    template_name = 'listings/listings_detail.html' 
    context_object_name = 'listing' 

在信息模型中,我有以下領域:

listing = models.CharField(max_length=50) 

我想編寫一個函數,確保上市變量是所有上案例 - 我知道如何編寫函數 - 我只是不知道如何將它整合到views.py文件中!

+1

你說你想「確保列表變量都是大寫」 - 你的意思是你打算接受輸入並希望在保存之前將其大寫?您在此處使用的視圖處理顯示數據庫中已存在的信息,但不處理創建或更新。 –

回答

1

有幾個可能性:

  1. 通過HTML中upper模板過濾器傳遞變量模板,就像這樣:

    {{ listing.listing|upper }} 
    

    ......就像jpic說的那樣。在這裏,上下文對象是「列表」,並且你想要的屬性是listing.listing。

  2. 創建返回屬性作爲全部大寫模型上的方法:

    class Listing(models.Model): 
        def uppercase_listing(self): 
         return self.listing.upper() 
    

    ,然後用它在模板中,像這樣:

    {{ listing.uppercase_listing }} 
    

    請注意,你可能只有沒有采用任何參數的方法,因爲沒有辦法在Django模板中的隱式方法調用中傳遞參數。

  3. 編寫自定義模板標籤或過濾器。對於這種簡單的使用(製作一個大寫的變量),它會過度殺傷,因爲已經有一個內置的過濾器(jpic指出)。但是如果您想要進行某種自定義更改,那麼自定義標籤或過濾器可能是合適的。

所以總結起來,你會通過調用一個函數從您的模板。

但在你的情況下,你不必,現有的內置過濾器已經存在,你想做什麼。

一般來說,django不鼓勵任何代碼進入模板。它試圖限制那裏進入相當的聲明式類型語句。目標是將所有的邏輯放入模型,視圖和其他Python代碼中,並且僅引用模板中的預先計算的值。

+0

謝謝,這非常有幫助。很好的答案。 –

4

爲什麼不只是使用upper template filter

無需編寫任何純Python來顯示大寫一個視圖環境變量...

+0

太棒了,我不知道Django有這個功能! –

+0

請[關閉此問題](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) – jpic

1

沒有什麼能阻止你在泛型類中定義自己的自定義方法,或者在另一個文件中定義它們並將它們導入到視圖中。例如:

class IndexView(generic.ListView): 
    template_name = 'listings/index.html' 
    context_object_name = 'latest_listings' 

    def your_method_here(self, listing_object): 
     # do your uppercase checking stuff here 
     # don't forget to .save() your listing_object if you change it to uppercase! 

    def get_queryset(self): 
     for listing_object in Listings.objects.all() 
      self.your_method_here(listing_object) 
     return Listings.objects.order_by('-pub_date') 

你也可以將它作爲一個普通函數,而不是一個方法,但這真的取決於你。

當然,其他一些建議,可能是在解決實際問題(大寫過濾)要好得多,但既然你問到調用views.py文件中的函數/方法,這就是答案。