1

クエリセットからオブジェクトのリストを表示する汎用テンプレートを作成しています。

{% for o in objects %}
    {{ o.name }}
{% endfor %}

さまざまな種類のフィルタリングと順序付けを行う必要がある複数の状況でテンプレートを使用できるようにしたいと考えています。このためのビュー関数を作成しました:

def display_objects(request, filters, orders, template_name):
    objects = Object.objects.all()
    for filter in filters:
        objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), filter['value']))
    for order in orders:
        objects = objects.order_by('-' if 'descending' in order else '' + order['field'])
    # render objects to template with context
    pass

これまでに行ったことがうまくいくかどうかはわかりませんが、問題が発生しました。現在の関数を使用して、URL でキャプチャされたパラメーターによってクエリ セットをフィルター処理できるかどうかはわかりません。

たとえば、特定のユーザーに関連するオブジェクトを表示したい場合は、次のようにします。

(r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact','value':account_username}], orders=[{'field':'foobar'}], template_name='user.html'))

明らかに、URL が解析され、display_objects 関数にディスパッチされるまで、account_username は定義されたフィールドではありません。account_username パラメーターを受け取るビュー関数を作成するのは簡単ですが、この関数を使用して、さまざまなキャプチャー パラメーターでフィルター処理される他のオブジェクト クエリ セットを表示できるようにしたいと考えています。

取得した URL パラメーターをビュー関数に渡して、クエリ セットを動的にフィルター処理したり、表示するように並べ替えたりする方法はありますか?

4

2 に答える 2

1

これを行う 1 つの方法を次に示します。

urls.py で:

(r'^user/(?P<account_username>[^/]+)/$', display_objects, dict(filters=[{'field':'account__username','relationship':'iexact'}], orders=[{'field':'foobar'}], template_name='user.html'))

そして、views.py で:

def display_objects(request, filters, orders, template_name, **kwargs):

    objects = Object.objects.all()
    for filter in filters:
        objects = objects.filter(('%s__%s' % (filter['field'], filter['relationship']), kwargs.get(filter['field'])))
    for order in orders:
        objects = objects.order_by('-' if 'descending' in order else '' + order['field'])
    # render objects to template with context
    pass

正直なところ、これが良い方法かどうかはわかりませんが...

于 2012-04-09T22:46:14.990 に答える
0

メソッドに文字列を直接渡すことはできませんfilter。それを kwargs に変換する必要があります。

query_string = '%s__%s' % (filter['field'], filter['relationship'])
objects = objects.filter(**{query_string: filter['value']}))
于 2012-04-09T23:04:39.480 に答える