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 回答
0

在外壳上:

books = Book.objects.order_by('price').values()
book = books[0]
print book['price']

因此,在模板中,您应该能够遍历书籍并访问字段:

{% for book in books %}    
    {{ book.price }}
{% endfor %}
于 2013-04-16T12:01:21.433 回答