2

私はモデルを持っています、

class Book(models.Model):
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    rating = models.FloatField()

Book オブジェクトをカテゴリに基づいて動的に並べ替えていますが、対応する値も取得したいと考えています。たとえば、それらがソートされている場合、対応する価格も表示したいと考えています。

やっている:

Book.objects.order_by('price').values()

そしてテンプレで

Book: {{ book }} - Price: {{ book.value.2 }} 

正常に動作します。ただし、実行時にソート可能なフィールドを選択したいのですが、たとえば、ページごとに並べ替える場合は、 を渡す必要がありbook.value.1ます。したがって、ビューはソートされたフィールドを通過する必要があります。以下のようなものが私の問題を解決します:

{{ book.{{ sortField }} }}

Django でエラーが発生します。どうすればこれを解決できますか? 対応する値を使用できるように、フィールドを渡すにはどうすればよいですか?

4

2 に答える 2

2

簡単な例:

テンプレート

<span>Currently ordering by {{ order_by }}</span>
<ul>
    <li><a href="?order_by=price">price</a></li>
    <li><a href="?order_by=pages">pages</a></li>
</ul>
<ul>
    {% for obj in object_list %}
        <li><a href="{{ obj.get_absolute_url }}">{{ obj.name }}</a></li>
    {% endfor %}
</ul>

ビュー.py

class FooListView(ListView):
    allow_ordering_on = ['pk', 'pages', 'price']  # restrictions
    order_by = 'pk'

    def get(self, request, *args, **kwargs):
        order_by = request.GET.get('order_by', self.order_by)

        if order_by in self.allow_ordering_on:
            self.order_by = order_by
            self.object_list = self.model.objects.all().order_by('whatever')
            if not allow_empty and len(self.object_list) == 0:
                raise Http404(_(u"Empty list and '%(class_name)s.allow_empty' is False.")
                              % {'class_name': self.__class__.__name__})
            context = self.get_context_data(object_list=self.object_list)
            return self.render_to_response(context)

        else:
            return super(FooListView, self).get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(FooListView, self).get_context_data(**kwargs)
        context['order_by'] = self.order_by
        return context

オーバーライドget_context_dataして、現在のフィールドの順序をマークする変数を追加できます。

于 2013-04-16T14:41:43.507 に答える