Я пытаюсь реализовать простую функцию, которая отправляет электронное письмо, если флажок установлен в администраторе при сохранении. например: простая статья вводится в админ, когда я удаляю его, он отправляет содержимое статьи (если флажок установлен). получил, что работает, но по какой-то причине он отправляет 3 раза! здесь слишком много кода для публикации здесь, но этого должно быть достаточно, чтобы узнать, что происходит, если это поможет в этом, если из раздела блога блога блога (который я клонировал).Django ModelForm в admin, сохраняющий несколько раз
ответ
Я не думаю, что администратор ModelForm является хорошим местом для запуска отправки почты. Я предлагаю использовать сигналы, как это:
from django.db.models.signals import post_save
class MyModel(models.Model):
...
def send_mail_for_my_model(sender, instance, created, **kwargs):
if created:
print "send mail"
#email stuff
post_save.connect(send_mail_for_my_model, sender=MyModel)
Я думаю, в вашем случае: OwnableAdmin.save_form() вызывает YourModelForm.save, что отправка почты. Than DisplayableAdmin.save_form() вызывает YourModelForm.save, отправляя почту снова. Это происходит потому, что первый аргумент save_form (self) является экземпляром IteAdmin с атрибутом формы, установленным в MyModelForm, и каждым классом подклассов ModelAdmin.
Я думаю, вы должны использовать подход, как, что, если вы хотите использовать ModelForm:
class OwnableAdmin(ModelAdmin):
def save_form(self, request, forms, change):
#do your actions
return super(OwnableAdmin, self).save_form(request, forms, change)
class DisplayableAdmin(ModelAdmin):
def save_form(self, request, forms, change):
#do your actions
return super(DisplayableAdmin, self).save_form(request, forms, change)
class TweetableAdminMixin(object):
...
class IteAdmin(OwnableAdmin, DisplayableAdmin, TweetableAdminMixin):
form = YourModelForm
readonly_fields=('email_sent',)
fieldsets = ite_fieldsets
def save_form(self, request, forms, change):
#do your actions
return super(IteAdmin, self).save_form(request, forms, change)
Кстати, в Python3 вы можете использовать супер() без аргументов.
Может быть, в вашем случае это будет хорошо для каждой модели, чтобы наследовать от другого, как:
class TweetableAdmin(ModelAdmin):
...
class DisplayableAdmin(TweetableAdmin):
...
class OwnableAdmin(DisplayableAdmin):
...
class IteAdmin(OwnableAdmin):
...
Во всяком случае, я рекомендую почитать статьи о питона супер:
- 1. запрос в ModelForm admin django
- 2. django filter admin ModelForm значения
- 3. Django Admin: Получение запроса в конструкторе ModelForm
- 4. Django Admin как Inlines в моем ModelForm
- 5. Django: текущий идентификатор пользователя для ModelForm Admin
- 6. ModelForm не отображается в admin
- 7. Несколько ManyToMany в Django Admin
- 8. Несколько приложений в Django admin
- 9. Как получить доступ к request.user в django modelform в admin
- 10. Django ModelForm
- 11. Django admin - динамическое обновление через ajax-выбор ChoiceField в ModelForm
- 12. Django admin несколько фотографий загрузить
- 13. django admin formfield_for_dbfield повышает количество раз
- 14. self.instance в Django ModelForm
- 15. Django ModelForm в DetailView
- 16. MultiValueDictKeyError В Django ModelForm
- 17. Изменение в Django ModelForm
- 18. django - queryset в modelForm
- 19. Multiple ModelForm в Django
- 20. DJANGO: request.POST.getlist() в ModelForm
- 21. Django ModelForm CheckBox Widget
- 22. Использование django-multiupload в ModelForm
- 23. Django Formset vs Modelform
- 24. Django включает несколько раз
- 25. Django ModelForm Дата проверки
- 26. Django ForeignKeys, не сохраняющий
- 27. Загрузка несколько файлов в ModelForm
- 28. Проверять несколько встроенных объектов в Django Admin
- 29. Проверка данных в Django ModelForm
- 30. Особенности виджета Django ModelForm
сигналов Выглядит круто! спасибо, но я все еще остаюсь с той же проблемой. Мне нужна модель model (я думаю), потому что флажок отделен от модели. Как и в i, я хочу отправить почту, если она проверена, поэтому мне нужно было создать форму, чтобы получить ее значение (которое не сохраняется вместе с моделью). любые предложения по лучшему подходу высоко ценятся – joeskru
OwnableAdmin.save_form() вызывает YourModelForm.save(), тем самым отправляя почту. Than DisplayableAdmin.save_form() вызывает YourModelForm.save, отправляя почту снова. Это происходит потому, что первый аргумент save_form (self) является экземпляром IteAdmin с атрибутом формы, установленным в MyModelForm. Вы должны изменить подход. –
Я думаю, вы должны сначала вызвать super (IteAdmin, self) в IteAdmin.save_form только один раз. Он будет вызывать метод TweetableAdminMixin.save_form, который будет выполнять свою работу (сберегающая модель), и в конце будет вызывать форму super (TweetableAdminMixin, self) .save и т. Д. И вы должны переупорядочить наследование классов следующим образом: класс IteAdmin (OwnableAdmin, DisplayableAdmin, TweetableAdminMixin): –