我有一个模型,其中Mail是外键。用户可以添加一个邮件对象,我想在单击应发送电子邮件时向更改表单添加一个按钮。
型号.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
)
我怎样才能达到同样的目的?
一个选项是在定义管理类时使用actions
。
https://docs.djangoproject.com/en/3.1/ref/contrib/admin/actions/
在您的管理员.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,并像处理任何正常视图一样处理它。
在您的管理员.py:
@admin.register(Evaluation)
class EvaluationAdmin(admin.ModelAdmin):
change_form_template = '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中添加一个用于发送电子邮件的url
url(r'^send-email/(?P<pk>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()