Как хранить переменные в поле базы данных 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.
Вернуться на верх