0

URL conf のハードコーディングを削除するために、クラスベースのビューを使用して同等の"method_splitter"を作成したいと考えています。

次の URL を取得したいと考えています。

ListView: http://mysite.com/<model_name>/
DetailView: http://mysite.com/<model_name>/<field_value>/

ListView のクエリは次のようになります。

<model_name>.objects.all()

DetailView のクエリセットは次のようになります。

<model_name>.objects.get(<field>=<field_Value>)

現在、私のビューは URL conf のハードコーディングの結果として機能しますが、スケーリングできるエレガントなソリューションを見つけたいと考えています。

私のソリューションでは 404 は返されませんが、何も表示されません。

ビュー.py

class ListOrDetailView(View):

def __init__(self, **kwargs):
    for key, value in kwargs.iteritems():
        setattr(self, key, value)

try: #If/Else instead?
    def goToDetailView(self, **kwargs):
        m = get_list_or_404(self.kwargs['model']) #Is this even needed?
        return DetailView(model=self.kwargs['model'], slug=self.kwargs['slug'], template_name='detail.html', context_object_name='object')

except: #If/Else instead?
    def goToListView(self, **kwargs):
        q = get_object_or_404(self.kwargs['model'], slug=self.kwargs['slug']) #Is this even needed?
        return ListView(model=self.kwargs['model'], template_name='list.html', context_object_name='object_list',) 

MyApp の urls.py

url(r'^(?P<model>[\w]+)/?(?P<slug>[-_\w]+)/$', ListOrDetailView.as_view()),
4

1 に答える 1

0

スポットライトが言ったように、これは恐ろしいデザインパターンです。Django の要点は、モデルとビューの分離です。さまざまなモデルをすべてカバーするために多くの反復コードを作成する必要があるのではないかと心配している場合でも、クラスベースのビューではそれほど問題にはならないことを信じてください。基本的に、公開したいモデルごとに、次のように記述する必要があります。

Urls.py:

urlpatterns = patterns('',
    url(r'^my_model/$', MyModelListView.as_view(), name="mymodel_list"),
    url(r'^my_model/(?P<field_value>\w+)/$', MyModelDetailView.as_view(), name="mymodel_detail"),
)

ビュー.py:

from django.views.generic import ListView, DetailView

class MyModelListView(ListView):
    model = MyModel


class MyModelDetailView(DetailView):
    model = MyModel

    def get_queryset(self):
        field_value = self.kwargs.get("field_value")
        return self.model.objects.filter(field=field_value)
于 2013-03-28T19:43:50.417 に答える