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