манипулирование текстом в django, как только пользователь / администратор вводит его - PullRequest
0 голосов
/ 03 декабря 2011

у меня есть простая модель:

class Article(models.Model):
    name = models.CharField(max_length=1000)
    custom_name = models.CharField(max_length=1000)

пользовательская функция: def process_text (my_string): return len (my_string)

я хочу следующее:

custom_name = process_text(name)

Предположим, что администратор вводит name как Mark Pilgrim, тогда custom_name должно иметь автоматически заполненное значение 12.

в admin.py могу ли я что-то наподобие

prepopulated_fields

, что было бы простым способом сделать это.

Спасибо !!

Ответы [ 3 ]

0 голосов
/ 03 декабря 2011

На мой взгляд, лучший вариант - установить значение на этапе проверки формы.

0 голосов
/ 04 декабря 2011

Самый простой способ сделать это - добавить метод, который прослушивает сигнал pre_save.

Вот пример, который вы можете использовать (этот код входит в ваш models.py для приложения)

from django.db.models.signals import pre_save
from django.dispatch import receiver

# Your models go here   
def process_text(mystring):
    return len(mystring)

@receiver(pre_save, sender=Article)
def my_handler(sender, **kwargs):
    if not kwargs['raw']:
         obj = kwargs['instance']
         obj.custom_name = process_string(obj.name)

Документация сигналов содержит больше информации о сигналах, а в документации pre_save перечислены аргументы, которые ожидает метод.

0 голосов
/ 03 декабря 2011

Если у вас есть форма с этими полями, вы можете использовать некоторый javascript для обновления второго поля, когда первое потерял фокус. Затем, когда кто-то введет что-то в первое поле и покинет поле, js сможет вычислить длину и поместить значение во второе поле.

Если это должно быть сделано на уровне бэкэнда - вы можете, например, переопределить метод save () модели. Больше здесь - https://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods

Приветствие.

...