2015-11-19 4 views
0

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

ответ

1

Я не думаю, что администратор 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): 
    ... 

Во всяком случае, я рекомендую почитать статьи о питона супер:

http://www.artima.com/weblogs/viewpost.jsp?thread=236275

+0

сигналов Выглядит круто! спасибо, но я все еще остаюсь с той же проблемой. Мне нужна модель model (я думаю), потому что флажок отделен от модели. Как и в i, я хочу отправить почту, если она проверена, поэтому мне нужно было создать форму, чтобы получить ее значение (которое не сохраняется вместе с моделью). любые предложения по лучшему подходу высоко ценятся – joeskru

+0

OwnableAdmin.save_form() вызывает YourModelForm.save(), тем самым отправляя почту. Than DisplayableAdmin.save_form() вызывает YourModelForm.save, отправляя почту снова. Это происходит потому, что первый аргумент save_form (self) является экземпляром IteAdmin с атрибутом формы, установленным в MyModelForm. Вы должны изменить подход. –

+0

Я думаю, вы должны сначала вызвать super (IteAdmin, self) в IteAdmin.save_form только один раз. Он будет вызывать метод TweetableAdminMixin.save_form, который будет выполнять свою работу (сберегающая модель), и в конце будет вызывать форму super (TweetableAdminMixin, self) .save и т. Д. И вы должны переупорядочить наследование классов следующим образом: класс IteAdmin (OwnableAdmin, DisplayableAdmin, TweetableAdminMixin): –

Смежные вопросы