Что вы можете делать с функцией Template Render в Django?

Мотивация

Мы написали небольшую платформу для тестирования профессоров, которая позволяет автоматически отправлять электронные письма студентам в нашем университете. И может случиться так, что профессору нужно отправить около 100 писем с разными данными.

Итак, мы решили позволить профессорам писать собственные шаблоны для писем. Электронное письмо выглядит так:

you need to pass the following test: 
Linear Algebra I
You will have 60 minutes. Once time is over, the test will be stopped automatically. 

The number of question in the test is 30. 

To enter the system, you need these credentials:
Login: john123
Password: 37823
Test URL: someurl.com
We wish you a good luck!

Дело в том, что логин и пароль генерируются системой, поэтому нам нужно отправить эти учетные данные студентам. Как видите, есть много мест, где текст предназначен для учащихся.

Наивный способ

Во-первых, мы подумали, что это довольно простая задача, и все, что нам нужно, - это функция «заменить» в Python.

Итак, код выглядел так:

template = Template(template_text)
template_filled = template.replace("first_name", assignment.student.first_name)
template_filled = template.replace("boyfriend_girlfriend", assignment.student.boyfriend_girlfriend)
template_filled = template.replace("whatever_else", assignment.student.whatever_else)
send_email(assignment.student.email, template_filled)

И проблема заключалась в том, что каждый день наши профессора хотели включать все больше и больше различных переменных. Также этот код не работал, если, например, имя дважды использовалось в тексте. И слишком много жесткого кодирования. Ненавижу это!

Шаблоны Django

А потом мы поняли, что это выглядит довольно знакомо. Мы делаем то же самое при генерации вывода HTML в Django! Почему бы не использовать это повторно? И, как ни удивительно, это оказалось так просто!

Теперь код выглядит так:

from django.shortcuts import render
from django.template import Template, Context
for assignment in assignments:
  template = Template(template_text)
  context = Context({'assignment': assignment})
  send_email(assignment.student.email, template.render(context))

Разве это не красиво?

Итак, наш template_text теперь выглядит так:

Dear {{assignment.person.first_name}}, /n /n
you need to pass the following test: /n
{{assignment.quiz_structure.name}}/n
You will have {{assignment.quiz_structure.minutes}} minutes. Once time is over, the test will be stopped automatically. /n
/n
The number of question in the test is {{assignment.quiz_structure.quantity}}/n /n
To enter the system, you need these credentials:
Login: {{assignment.person.user.username}}/n
Password: {{assignment.person.password}}/n
Test URL: someurl.com/n /n
We wish you a good luck!

И теперь профессора могут использовать «циклы for», если захотят. И да, желают :)

Подробнее о функции

Давайте рассмотрим еще несколько примеров визуализации храмов, чтобы лучше понять, как это работает.

Нам нужно сделать две вещи:

  1. Напишите текст и создайте шаблон с помощью функции «Шаблон».
  2. Передайте данные контекста в средство визуализации.

Вот простой пример:

template = Template("Hello, {{var1}}!")
context = Context({"var1": "world"})
print(self.style.SUCCESS(template.render(context)))

Очевидно, это приводит к «Hello, world!».

Вот пример цикла for:

template = Template(
"""
{% for student in students %}
Hello, {{student}}! 
{% endfor %}
""")
context = Context({"students": ["John", "Andrew", "Victor"]})
print(self.style.SUCCESS(template.render(context)))

Как видите, профессора могут даже заранее прислать все вопросы каждому студенту :) Я уверен, что они этого не делают.

Спасибо за прочтение!

Ваши проекты Django работают слишком медленно? Взгляните на эту статью: