Если я вас хорошо понимаю, вы хотите написать код шаблона, который будет отображаться в коде шаблона, а затем снова обрабатываться.Что-то вроде ... мета-шаблонов?
Я вижу, вы уже разобрались с первой частью, но теперь вам нужно снова проанализировать полученный код, чтобы установить соответствующее значение для {{ request.user }}
.
Я достигаю этого с помощью промежуточного программного обеспечения, но так как синтаксический анализ шаблона является дорогостоящей операцией, я реализовал некоторый механизм для применения процесса «повторного анализа» только к URL-адресам / представлениям моего выбора.
Модель.
class ReparsingTarget(models.Model):
url_name = models.CharField(max_length=255)
Достаточно простая, просто модель для хранения тех имен URL, на которые я хочу воздействовать промежуточным программным обеспечением.
Промежуточное программное обеспечение.
class ReparsingMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
# We are no interested in whatever happens before
# self.get_response is called.
response = self.get_response(request)
# Now we will re-parse response just if the requested url
# is marked as target for re-parse.
if self._marked(request) and isinstance(response, TemplateResponse):
# Decode the template response code ...
content = response.content.decode('utf-8')
# Create a Template object ...
template = Template(content)
# Provide request to de context ...
context_data = response.context_data
context_data.update({'request': request})
# ... and renders the template back the the response.
response.content = template.render(Context(response.context_data))
return response
def _marked(self, request):
url_name = resolve(request.path_info).url_name
return ReparsingTarget.objects.filter(url_name=url_name).exists()
Это действительно простая реализация, для меня было непросто выяснить, как воплотить идею в код Django.
На практике.
Некоторая модель.
class Foo(models.Model):
label = models.CharField(max_length=255)
Шаблон:
{% for foo in foos %}
{% comment %} Remember foo.label == '{{ request.user }}' {% endcomment %}
<p> Username: {{ foo.label }} </p>
{% endfor %}
Сохраненный Foo
экземпляр:
И результат: