【问题标题】:Django Admin: Add Action Button To Send EmailDjango 管理员:添加操作按钮以发送电子邮件
【发布时间】:2020-12-02 21:08:16
【问题描述】:

我有一个模型,其中 Mail 是外键。用户可以添加一个邮件对象,我想在单击应该发送的电子邮件时在更改表单中添加一个按钮。

models.py

class Evaluation(models.Model):
    ...
    mail                        = models.ForeignKey(Mail, related_name="evaluation", null=True, blank=True, on_delete=models.CASCADE)

我可能希望按钮执行如下操作:

def process(self):
      if self.mail is not None:
          send_mail(
                    self.mail.subject,
                    self.mail.body,
                    settings.EMAIL_HOST_USER,
                    [self.lead.user.email],
                    fail_silently=False
            )

我怎样才能达到同样的效果?

【问题讨论】:

    标签: django django-models django-views django-forms django-admin


    【解决方案1】:

    一种选择是在定义管理类时使用actions

    https://docs.djangoproject.com/en/3.1/ref/contrib/admin/actions/

    在你的 admin.py 中:

    def send_emails(modeladmin, request, queryset):
        for obj in queryset:
            #call the process function defined in your Evaluation model
            obj.process()
    send_emails.short_description = 'Send e-mails'
    
    
    @admin.register(Evaluation)
    class EvaluationAdmin(admin.ModelAdmin):
        ...
        actions = [send_emails]
    
    

    这将为您提供一个下拉选项,用于向管理列表中的选定对象发送电子邮件。

    另一种选择是覆盖管理模板更改表单并为该按钮添加自定义按钮和 url 并像处理任何普通视图一样处理它。

    在你的 admin.py 中:

    @admin.register(Evaluation)
    class EvaluationAdmin(admin.ModelAdmin):
        change_form_template = 'admin/evaluation_change_form.html'
        ...
    

    然后在 /您的基本模板目录/admin/evaluation_change_form.html 中是这样的:

    {% extends "admin/change_form.html" %}
    
    {% block form_top %}
        <form action="{% url 'send-email' pk=original.id %}" method="POST">
              {% csrf_token %}
              <input type="submit" value="Send Email" name="email">. 
        </form>
    {% endblock %}
    

    然后在 urls.py 中为 send-email 添加一个 url

    url(r'^send-email/(?P&lt;pk&gt;\d+)/$', SendEmail.as_view(), name='send-email'),

    然后在视图中:

    from django.views import View
    
    
    class SendEmail(View):
        def post(self, request, *args, **kwargs):
            obj = get_object_or_404(Evaluation, pk=self.kwargs['pk'])
            #call the process function defined in your Evaluation model
            obj.process()
    
    
    

    【讨论】:

    • 我尝试了第二个选项,点击它只是试图打开另一个页面并显示“不允许获取”
    • 啊,你需要一个表单来代替 标签。将编辑答案。
    • 当 Django 告诉你 GET 是不允许的,你可以看到你已经完成了 90%,你只是使用了错误的方法来访问 URL。视图只接受 POST(因为我们只在视图中定义了一个 post 函数),POST 数据的最佳方式是使用表单,所以我将代码更改为使用带有 method="POST" 的表单,它应该现在工作。
    猜你喜欢
    • 2014-06-28
    • 2010-11-27
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    相关资源
    最近更新 更多