1

很新的Django的/ Python的,我已經閱讀關於這個問題噸文檔和帖子後,創下了磚牆...查詢集混亂Django管理

所以我工作的一個簡單的Django的應用程序,有一個SQLlite數據庫/名稱和電子郵件地址表。我希望能夠通過管理面板發送電子郵件,並使用我爲特定名稱/地址組合選擇的複選框使用名稱和電子郵件地址。桌子本身工作正常,因爲我可以從我的網站上的其他視圖發送電子郵件。

我正在做一個自定義的管理動作的話,我認爲這是去了解這個正確的方法...

我想我理解的queryset參數是什麼以及它的功能如何,但無論我做什麼,我都會收到'QuerySet' object has no attribute 'name'錯誤。很明顯,我不知道queryset如何在管理操作中起作用。

from django.contrib import admin 
from email_check.models import employeeEmail 
from django.template import loader, Context 
from django.core.mail import send_mail 


class employeeEmail_Admin(admin.ModelAdmin): 
    list_display = ('name', 'address') 
    actions = ['resend_message'] 

    def resend_message(self, request, queryset): 
     for employeeEmail.address in queryset: 
      message = loader.get_template('email.txt') 
      messageContext = Context({ 
       'name': queryset.name 
      }) 
      send_mail('Test Subject Line', message.render(messageContext), '[email protected]', [queryset.address], 
         fail_silently=False) 

admin.site.register(employeeEmail, employeeEmail_Admin) 

我意識到這是一個有點模糊,但基本上我希望找出如何訪問的名稱和地址,不讓我employeeEmail模型/表的屬性,所以我可以從管理面板發送電子郵件。我有queryset.name[queryset.address],那些只是示例佔位符,因爲我嘗試過許多不同的事情,但都沒有成功,我猜我沒有靠近解決方案。

回答

2

這不是Python for循環的工作原理。你想要的東西是這樣的:

for employee in queryset: 
     message = loader.get_template('email.txt') 
     messageContext = Context({ 
      'name': employee.name 
     }) 
     send_mail('Test Subject Line', message.render(messageContext), '[email protected]', [employee.address], 
        fail_silently=False) 

問題是queryset提供了employeeEmail模型的多個實例。當您在查詢集上運行for循環時,employee將按順序綁定到它們中的每一個。

+0

** YES!**這工作完美!我更關心queryset的工作方式,並沒有意識到我可以在我的循環/管理操作中使用'employeeEmail.name'和'employeeEmail.address'。沒有for循環會有更好的方法嗎? – purpleSun 2013-05-10 23:21:27

+0

您可以使用send_mass_mail而不是send_mail來節省一些時間,但需要花費更多的內存來構建消息元組。只要你需要爲每個收件人定製消息(添加他們的名字或類似的東西),我沒有看到避免for循環的好方法。如果每個人的消息都相同,則可以使用values_list查詢批量提取電子郵件地址。 – 2013-05-10 23:28:57

+0

實際上,現在我已經檢查了源代碼而不僅僅是文檔,我發現你可以使用一個懶惰的評估生成器,它返回一個元組來代替send_mass_mail實際的消息元組,這樣可以節省額外的記憶。除了內部,send_mass_mail無論如何都會創建一個列表。我想它仍然可以爲你節省一些記憶,但不像我第一次想到的那樣。 – 2013-05-10 23:35:31