ListView
在開發(fā)一個網(wǎng)站時,我們常常需要獲取存儲在數(shù)據(jù)庫中的某個model的列表熏挎。
示例代碼
def show_list(request):?
? ? model_list = Model.objects.all()
context = {"request": request, "model_list": model_list}
return render_to_response(index.html", context)
項目中可能會有大量的這樣的視圖,如果每一個model都這樣寫的話洒擦,會不斷的重復(fù)工作帖烘。
這時ListView就有優(yōu)勢了,他是把這些邏輯抽象到一個類里面氛什,直接繼承即可。
class ModelView(ListView)
? ? template_name = "index.html"
? ? model = Model
? ? content_object_name = "obj_list"
直接這樣寫就代替了上面的示例代碼的功能剔桨。
template_name 屬性來指定需要渲染的模板
model屬性來指定我們要操作的Model模型
context_object_name屬性來指定獲取得model列表的變量名屉更,不寫的話,默認為object_list洒缀。
還可以重寫父類的方法瑰谜,達到定制的目的。
復(fù)寫get_object方法以增加獲取單個model對象的其他邏輯树绩。
復(fù)寫get_context_data方法來為上下文對象添加額外的變量以便在目標中訪問萨脑。示例代碼如下
def get_context_data(self, **kwargs):
? ? kwargs["obj_list"] =self.model.objects.all()
? ? return super(self.__class__, self).get_context_data(**kwargs)
template_name也可以通過get_template_names方法來指定。代碼如下
def get_template_names(self):
? ? return "index.html"
DetailView
獲取單個model對象也很常見饺饭。視圖函數(shù)示例代碼如下
def detail(request, obj_id):
? ? obj = model.objects.get(pk=obj_id)
? ? context = {"request":request, "obj": obj}
? ? return render_to_response("detail.html", context)
同樣的如果這種需求過多的話渤早,開發(fā)人員就需要枯燥乏味的重復(fù)編寫了。因此Django使用DetailView來把這種邏輯抽象出來瘫俊,把視圖函數(shù)轉(zhuǎn)化為類視圖鹊杖。
class ModelDetailView(DetailView):
? ? model = Model
? ? template_name = "detail.html"
? ? context_object_name = "obj"
? ? pk_url_kwarg ="pk" ? ?#pk_url_kwarg默認值就是pk,這里可以覆蓋扛芽,但必須和url中的命名組參數(shù)名稱一致
model骂蓖,template_name和context_object_name的含義同上。
urls.py中這樣寫川尖,其中pk就是關(guān)鍵字參數(shù)的名字登下,一般指id
urlpatterns = [
?? ?url(r'^detail/(?P<pk>\d+)/$', ModelDetailView.as_view(), name='detail'),
]
其中URL中的命名組參數(shù)pk需要和視圖中的pk_url_kwarg的值保持一致才行。
就可以了!1环肌缰贝!