2016-06-18 11 views
0

Ich versuche, einen Newsletter zu implementieren und ein Auswahlfeld zu meiner UserProfile-Klasse hinzuzufügen, damit Benutzer auswählen können, ob sie einen Newsletter erhalten möchten oder nicht:Wie kann ich nur bestimmten Benutzern eine Newsletter-Mail (Django) senden?

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    YES = 'YS' 
    NO = 'NO' 
    NEWS_CHOICES = (
     (YES, 'Yes'), 
     (NO, 'No'), 
    ) 
    newsletter = models.CharField(max_length=2, choices= NEWS_CHOICES, default=NO) 

Und ich habe diese Ansicht einen Newsletter an die Benutzer zu senden, die einen Newsletter (ausgewählt 'Ja') erhalten möchten:

@user_passes_test(lambda u: u.is_superuser) 
def newsletter_form(request): 
    if request.method == 'POST': 
     form = NewsletterForm(request.POST or None, request.FILES or None) 
     if form.is_valid(): 
      reader = UserProfile.objects.filter(newsletter='YS') 
      instance = form.save(commit=False) 
      instance.save() 
      subject = 'This is the Newsletter!' 
      message = 'Hello!' 
      from_email = settings.EMAIL_HOST_USER 
      to_list = [reader.user.email] 
      html_message = loader.render_to_string('gaestebuch/newsletter.html') 
      send_mail(subject, message, from_email, to_list, fail_silently = True, html_message=html_message) 
      return redirect('gaestebuch:index') 
     else: 
      print form.errors 
    else: 
     form = NewsletterForm() 
    context = {'form': form} 
    return render(request, 'gaestebuch/newsletter_form.html', context) 

ich struggeling mit:

to_list = [reader.user.email] 

Der Fehler Ich erhalte ist:

'QuerySet' object has no attribute 'user' 

ich froh wäre, wenn jemand mich an dieser Stelle helfen könnte :)

Antwort

1

Da der Fehler anzeigt, reader, ein queryset ist, aber Sie scheinen behandle es als eine einzige Instanz von UserProfile. Dies sollte alle Empfänger auf der Liste hinzuzufügen arbeiten:

to_list = [r.user.email for r in reader] 

Sie weisen jedoch die following part of the documentation (Hervorhebung von mir):

recipient_list: Eine Liste von Strings, die jeweils eine E-Mail-Adresse. Jedes Mitglied von recipient_list sieht die anderen Empfänger im Feld "An:" der E-Mail-Nachricht.

Wenn Sie nicht möchten, dass alle Empfänger sich gegenseitig sehen, müssen Sie für jeden einzelne Nachrichten senden.

+0

Vielen Dank für Ihre Hilfe! – Dannad