簡體   English   中英

我可以簡化我的django數據庫,在該數據庫中,我對許多不同的模型都有許多相似的視圖(即創建,列出)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM