2009-04-06 12 views
14

私のDjangoアプリには、ニュースレターモデルがあります。今、私はニュースレター(とさえ再送それ)Djangoの管理者からの送信にできるようにしたいと思います。Django Adminのカスタムアクション

Model.save()メソッドのフックでこれを行うことはできますが、モデルに結び付けられていない別の方法がありますか?

おかげ

答えて

16

Admin actionsは、簡単に管理者のリストページから選択した項目に対して実行できるカスタムアクションをフックアップすることができます。

+0

これは良い解決策であるように思わようなものに

def available (modeladmin,request,queryset): queryset.update(status='ava') def not_available (modeladmin,request,queryset): queryset.update(status='not') 

を変更するには、このhttps://www.youtube.com/watch?v=WvL1cR2MgLI

を試すことができます。私は自分のサイトを更新するのは大きな問題ではないと思いますが、Django 1.1より前にどうやってこれをやったのですか? – Lorenzo

+1

この機能は、実際にサードパーティのアプリとして開始されました:http://code.google.com/p/django-batchadmin/ –

+0

更新のみ。 Djangoには、1.1以降のすべてのバージョンでAdminアクションが追加されました。http://docs.djangoproject.com/en/1.2/ref/contrib/admin/actions/ –

1

管理者からやっている場合は、save()メソッドをオーバーライドする必要がありますが、AdminModel save ...が完全なモデル保存である必要はありません。あなたは電子メールのたくさんを電子メールで送信している場合

しかし、より良いアプローチは、後の処理のためにキューにメールを入れるdjango-mailerをインストールすることであろうし、新しい管理コマンドを提供します:send_mail。

ニュースレターを送信する準備ができたら、手動でpython manage.py send_mailを実行してください。エラーのある電子メールは遅延キューに移動され、後で再送信することができます。

manage.py send_mailをcronから実行すると、これを自動化できます。

あなたが本当に気に入って管理サイトからやりたいのであれば、django-chronographをインストールしてそこからsend_mailスケジュールを設定してください。

+0

ModelAdmin.save()とModelの違いは何でしょうか。セーブ()? – Lorenzo

+0

models.pyのモデルに保存する代わりに、admin.pyのadmin.ModelAdminクラスに保存することを意味します。 –

+0

こちらのドキュメントをご覧ください:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#save-model-self-request-obj-form-change –

1

あなただけ

def send(modeladmin, request, queryset): 

for data in queryset: 

    subject=data.title 
    message=data.mesage 


    for d in Users.objects.filter(newsletter=True): 
     email=d.email 



     sendemail = EmailMessage(subject, message+unsubscribe, '[email protected]', 
      [email], [], 
      headers = {'Reply-To': '[email protected]'}) 

     sendemail.content_subtype = "html" 

     sendemail.send()