Учитывая следующие модели:Как получить доступ к настраиваемому менеджеру обратных моделей в шаблоне?
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()
В моем РЕПЛА я могу получить доступ к обычаю, связанным менеджеры, как так:
>>> 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 %}
Итак, есть ли способ доступа к этим пользовательским менеджерам моделей в наших шаблонах, о которых я не знаю? Что-то подобное никогда не предназначалось? Любые внешние решения?
Edit: В случае существует некоторая путаница в комментариях, я не предлагаю следующее:
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
.
Я не думаю, что это возможно. Однако вы можете создать запрос в представлении и передать его в шаблон. Это на самом деле предпочтительный способ, поскольку концептуально шаблон не должен вызывать запросы. – spectras
Из того, что я видел, я тоже не думаю, что это возможно. Даны ли запросы на запросы, ленивы, не заставляют шаблоны всегда запускать запросы? Не помешало бы запросам в шаблонах упасть на что-то вроде 'select_related' и' prefetch_related'? –
Точка зрения была создана для создания, а не шаблона. Это правда, что они ленивы, поэтому шаблонная оценка вызовет их, но это детализация реализации. Например, шаблон может зацикливаться на 'all_books', но это зависит от представления, чтобы определить, что такое' all_books'. – spectras