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

Это будет работать очень хорошо и выполнит вашу необходимую работу.

Вернуться на верх