Правильный случай использования сигналов Django - PullRequest
3 голосов
/ 14 ноября 2011

У меня глобальный вопрос и вопрос о конкретной проблеме в контексте сигналов. Чтобы решить, какие проблемы, диспетчер сигналов наиболее полезен, перебор?

У меня проблема сохранения нескольких моделей с внешним ключом. Я предположил, что этот сигнал может решить эту проблему. Но я не могу понять, как, потому что я не понимаю объем сигналов.

модель

class CV(models.Model):
    title = models.CharField(max_length=255)
    # And other fields...

class HigherEducation(models.Model):
    cv = models.ForeignKey(CV, blank=True, null=True)
    institution = models.CharField(max_length=255)
    # And other fields...

class ProfessionalExperience(models.Model):
    cv = models.ForeignKey(CV, blank=True, null=True)
    company_name = models.CharField(max_length=255)
    # And other fields...

Все формы являются формами моделей, унаследованными от моделей выше. Последние два используются в наборе моделей. Все эти формы отображаются в одной HTML-форме в шаблоне.

форма

class CVForm(forms.ModelForm):
    class Meta:
        # All the stuff

class EducationForm(forms.ModelForm):
    class Meta:
        # All the stuff

class ExperienceForm(forms.ModelForm):
    class Meta:
        # All the stuff

Education = modelformset_factory(HigherEducation, 
                                 form=EducationForm,
                                 max_num=2)
Experience = modelformset_factory(ProfessionalExperience,
                                  form=ExperienceForm,
                                  max_num=1)

В представлении мне нужно сохранить поля EducationForm и ExperienceForm с полем cv с назначенным идентификатором текущей модели CV.

Могу ли я решить эту проблему с помощью сигналов?

Трудно было сформулировать проблему, поэтому, если что-то не понятно, я отредактирую вопрос.

1 Ответ

12 голосов
/ 14 ноября 2011

Сигналы - это просто зацепки, которые позволяют вам запускать фрагменты кода после того, как происходит определенное действие, то есть «когда экземпляр / строка модели Foo сохранена, запустите функцию baz()».Сигналы состоят из двух компонентов: фактический сигнал (выполненное действие - сохранение / удаление и т. Д.) И функция приема (что делать, когда это действие происходит).

В Django встроено много сигналов (например, сработал после или до операции сохранения, сигнал сработал после или до операции удаления)но вы также можете создавать свои собственные сигналы.Если у вас есть процесс регистрации на вашем веб-сайте, вы можете написать сигнал, который срабатывает, когда пользователь создает учетную запись, а затем связать этот сигнал с функцией, которая отправляет пользователю электронное письмо

Я не думаю, что ваша ситуациясвязано с использованием сигналов.Для меня это звучит так, как будто вы хотите создать одну форму (состоящую из 3 небольших форм), в которой последние 2 формы («Образование и опыт») полагаются на предыдущую форму (CV), сохраняемую в первую очередь?проблема в том, что вы не можете заполнить 2-ю и 3-ю форму, не заполнив первую 1-ю форму (так как резюме еще не существует), поэтому для достижения этого вам лучше всего создать мастер форм с3 шага;сначала сохраните CV, затем с помощью CV покажите 2-й и 3-й этапы (которые на этом этапе CV уже будут сохранены)

...