Django - Как сохранить отдельные элементы поля CharField при отправке формы?
Когда я отправляю свою форму, я хочу, чтобы текст, отправленный как "note", был разделен, скажем, на абзацы, а также автоматически сохранен в части "tag" моей модели.
У меня есть следующее models.py
class NoteModel(models.Model):
note = models.CharField(
max_length = 5000
)
def __str__(self):
return f"{self.note}"
class NoteTagModel(models.Model):
note = models.ForeignKey(
NoteModel,
on_delete=models.CASCADE,
related_name="notes",
blank= False,
null = True,
)
tag = models.CharField(
max_length = 5000
)
def __str__(self):
return f"Note: {self.note} | Tag: {self.tag}"
У меня есть следующее forms.py
class NoteTagForm(ModelForm):
class Meta:
model = NoteTagModel
fields = [
'note',
]
Есть ли способ сделать это с помощью сигналов? Или использование скрытого инлайн-форсета будет лучшим способом? Любые другие предложения будут высоко оценены.
Я понимаю, что JavaScript может понадобиться для выделения текста и объявления его в качестве переменной, которая будет сохранена как значение формы.
Большое спасибо
Вы можете легко сделать это с помощью сигналов. Пример кода здесь .
from django.db.models.signals import pre_save
from django.dispatch import receiver
from .models import NoteModel
@receiver(pre_save , sender = NoteModel)
def take_data_from_note_and_add_to_tag(sender , instance , **kwargs):
note = instance
# splitting it in paragraph form .
data_list = note.split("\n")
print(data_list)
# check the paragraph you want in the tag field , i am choosing the first one.
tag = data_list[0]
note.tag = tag
Запишите это в новый файл с именем signals.py в том же приложении, где у вас есть ваша модель .
затем перейдите в ваш apps.py и добавьте в него новую функцию с именем ready и импортируйте туда ваши сигналы .
Код примера
from django.apps import AppConfig
class SomeAppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app'
# add your ready function here and import signals like this.
def ready(self) :
import someapp.signals
Это будет работать очень хорошо и выполнит вашу необходимую работу.