Как хранить переменные в поле базы данных Django?
Я пытался выяснить, возможно ли хранить переменную в поле базы данных Django. Вот пример:
class Message(models.Model):
message = models.TextField()
Затем в поле HTML-формы кто-то вводит что-то вроде этого:
Hi {{ user.first_name }}, thanks for signing up to our {{ company.name }} newsletter.
Затем это сохраняется в базе данных, и когда письмо отправляется по электронной почте, эти поля автоматически заполняются соответствующими данными.
Надеюсь, это имеет смысл. Спасибо.
Это своеобразное решение, оно не хранит переменную в Модели...
Но вы можете отображать простые строки с помощью шаблонизатора... но нужно как-то заполнить контекст / передать объект пользователя + компанию - так что это половинчатое решение
from django.template import Template, Context
from django.core.mail import send_mail
# Fetch Message Obj
msgObj = Message.objects.all().first()
print(msgObj.message)
# Hi {{ user.first_name }}, thanks for signing up to our {{ company.name }} newsletter.
# I added a user field to message, just for ease in this example
print(msgObj.user)
# Set msg Contents as a Template
emailtemplate = Template(msgObj.message)
# The hard part, set the context.
data = {
'user': msgObj.user,
}
if 'company' in msgObj.message: # If, so we're not fetching data that's not needed (a regex like ~ '{{ keywork.[a-zA-Z0-8]+ }}' would be better)
# company in message, get user's company
data['company'] = msgObj.user.company_set.first()
# Use Template Engine to Render with Context
emailtext = emailtemplate.render(Context(data))
print(emailtext)
# Hi Neal, thanks for signing up to our TestCompany newsletter.
send_mail(
'Test Message', # subject
emailtext, # contents
None, # from
['test@example.com'], # to
fail_silently=False,
)
В зависимости от контекста: Вы можете использовать:
- Комбинация жестко закодированных часто используемых ключевых слов или Объектов
- Использовать дополнительные поля в сообщении Obj для получения других данных (например, компании)
- Вы можете передать контекст в функцию при отправке письма (например, пользователя)
Надеемся, что вы найдете что-то из этого полезным. Было интересно изучать, тестировать и учиться. Спасибо за вопрос!
Очевидное использование для models.JSONfield
. Хранить/извлекать/обновлять
instance.variables = { variable1_name: variable_1 value, ... }
и вы можете заполнить шаблон типа "hello {first_name}"
с
try:
template.format( **instance.variables )
except KeyError as e:
# one or more {var} in the template string didn't have a definition
# in instance.variables
print( e.args ) # is a tuple of these undefined key names.