2009-04-06 40 views
14

w mojej aplikacji Django mam model Newslettera. Teraz chciałbym, aby móc wysłać newsletter (a nawet Wyślij ponownie IT) z Django Admin.Niestandardowe akcje w Django Admin

Mogę to zrobić za pomocą haka na metodzie Model.save(), ale czy istnieje inny sposób, który nie jest związany z modelem?

Dzięki

Odpowiedz

16

Admin actions pozwalają na łatwe podłączenie akcje niestandardowe, które mogą być wykonywane na wybranych pozycji z listy stron admin za.

+0

To wydaje się być dobrym rozwiązaniem. Nie sądzę, że aktualizowanie mojej strony byłoby dużym problemem, ale jak ludzie robili to przed Django 1.1? – Lorenzo

+1

Ta funkcja faktycznie rozpoczęła się jako aplikacja innej firmy: http://code.google.com/p/django-batchadmin/ –

+0

Po prostu aktualizacja; Django zawiera teraz akcje administracyjne we wszystkich wersjach po 1.1: http://docs.djangoproject.com/en/1.2/ref/contrib/admin/actions/ –

1

Jeśli robisz to od administratora, musisz zastąpić metodę save(), ale może to być zapis składowania AdminModel ... nie musi być pełnym składnikiem modelu.

Jednak jeśli wysyłając do dużo maili, lepszym rozwiązaniem byłoby zainstalowanie django-mailer co stawia maili w kolejce do późniejszego przetworzenia, a następnie udostępnia nowe polecenie zarządzania: send_mail.

Kiedy już będziesz gotowy do wysłania biuletynu, możesz ręcznie uruchomić python manage.py send_mail. Wszystkie e-maile z błędami zostaną przeniesione do odroczonej kolejki, w której możesz spróbować wysłać je później.

Możesz to zautomatyzować, uruchamiając manage.py send_mail z cron.

Jeśli naprawdę chcesz mieć ochotę i zrobić to ze strony administratora, zainstaluj django-chronograph i skonfiguruj tam harmonogram wysyłania wiadomości.

+0

Jaka byłaby różnica między ModelAdmin.save() a modelem. zapisać()? – Lorenzo

+0

Znaczenie zamiast zapisywania w Modelu w models.py zapisujesz w klasie admin.ModelAdmin w pliku admin.py. –

+0

Zobacz dokumentację tutaj: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#save-model-self-request-obj-form-change –

1

można spróbować to https://www.youtube.com/watch?v=WvL1cR2MgLI

wystarczy zmienić

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

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

coś jak

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()