[英]Can I simplify my django database where I have many similar views (i.e. create, list) for many different models
我有幾個具有相似視圖的模型...是否可以編寫一個列表/創建/詳細視圖並將該單個視圖應用於我的所有模型?
def modelalist(request):
objects = ModelA.objects.all()
context = {
"objects": objects,
}
return render(request, "app/modelalist.html", context)
def modelblist(request):
objects = ModelB.objects.all()
context = {
"objects": objects,
}
return render(request, "app/modelblist.html", context)
# and on and on....
什么是最佳做法?
您可以考慮使用基於類的視圖 。 如果使用內置的基於類的視圖ListView
,則幾乎沒有代碼重復。
from django.views.generic.list import ListView
class ModelAList(ListView):
model = ModelA
template_name = 'app/modelblist.html'
class ModelBList(ListView):
model = ModelB
template_name = 'app/modelblist.html'
如果您使用默認值"[app_name]/[model_name]_list.html"
則template_name
是可選的。 這也需要您重寫網址:
urlpatterns = [
url('...', modelalist, name='...'), # old
url('...', ModelAList.as_view(), name='...') # new
]
最后一個區別是在模板中,上下文變量objects
現在是object_list
。
根據您的示例,我假設您可以執行以下操作:
def list_model(request, model_class, template, **kwargs):
objects = model_class.object.all(**kwargs)
context = {
"objects": objects,
}
return render(request, template, context)
然后為其他模型調用它:
def modelalist(request):
return list_model(request, ModelA, "app/modelalist.html")
def modelblist(request):
return list_model(request, ModelB, "app/modelblist.html")
如果所有模板都放在標准位置,則也可以將其重構。
手工解決方案:
# views.py
import os
from django.apps import apps
def modellist(request, app_label model_name):
model = apps.get_model(app_label, model_name)
objects = model.objects.all()
template = os.path.join(app_label, "{}list.html".format(model_name)
context = {
"objects":objects,
}
return render(request, template, context)
# urls.py
urlpatterns = [
url(r"^(?P<app_label>\w+)/(?P<model_name)\w+/", views.modellist, name="modellist")
]
但是我絕對不會做這樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.