如何在模板中访问自定义反向模型管理器?

时间:2016-08-17 12:23:49

标签: python django

鉴于以下模型:

class Author(models.Model):
    name = models.CharField(max_length=20)

class CustomQuerySet1(models.QuerySet):
    def some_method(self):
        return 'custom queryset 1'

class CustomQuerySet2(models.QuerySet):
    def some_method(self):
        return 'custom queryset 2'

class Book(models.Model):
    author = models.ForeignKey(Author, related_name='books')
    title = models.CharField(max_length=50)

    objects = models.Manager()
    custom1 = CustomQuerySet1.as_manager()
    custom2 = CustomQuerySet2.as_manager()

在我的REPL中,我可以访问自定义相关管理器,如下所示:

>>> author = Author.objects.create(name='John')
>>> book = Book.objects.create(author=author, title='Hello')
>>> author.books(manager='custom1').some_method()
   'custom queryset 1'
>>> author.books(manager='custom2').some_method()
   'custom queryset 2'

在我们的模板中,我们通常通过默认管理器访问相关对象,如下所示:

{% for book in author.books.all %}
    {{ book.title }}
{% endfor %}

我们显然不允许进行函数调用并在模板中传入参数:

{% for book in author.books(manager='custom1').some_method %}
{% endfor %}

那么我们在模板中访问这些自定义相关模型管理器是否有本地方法?我不知道?这样的事情从未打算过吗?任何外框解决方案?

编辑: 如果评论中有一些混淆,我不建议如下:

def some_view(request):
    context = {}
    template = 'my_template.html'
    context['author'] = Author
    return render(request, template, context)

然后调用author.objects.all,而是:

def some_view(request):
    context = {}
    template = 'my_template.html'
    author = Author.objects.get(name='John')
    context['author'] = author
    return render(request, template, context)

然后访问author.books.custom1.some_method。请注意related_name模型上定义的author上的Book

1 个答案:

答案 0 :(得分:0)

没有,我认为不会(因为它不应该)。 模板是最终呈现数据的地方,因此它应该全部准备好,模板标记仅用于以方便的方式呈现。

但是,对于模板过滤器来说这是一个不错的主意。