首页 > 解决方案 > 如何允许 auth 用户从 django admin 发送时事通讯

问题描述

我正在为公司网站实施通讯应用程序。我的目标是让“未来”的网站管理员直接从管理员那里发布新闻通讯。

为此,我编写了以下代码:

模型.py

from django.db import models
from ckeditor.fields import RichTextField

class NewsletterSubscription(models.Model):
    datetime = models.DateTimeField(auto_now_add = True)
    email = models.EmailField(max_length=128)

    class Meta:
        verbose_name = 'Iscritto Newsletter'
        verbose_name_plural = 'Iscritti Newsletter'

    def __unicode__(self):
        return self.email

class Newsletter(models.Model):
    EMAIL_STATUS_CHOICES = (
        ('Draft', 'Draft'),
        ('Pubblicata', 'Pubblicata')
    )
    subject = models.CharField(max_length=250)
    body = RichTextField()
    email = models.ManyToManyField(NewsletterSubscription)
    status = models.CharField(max_length=10, choices=EMAIL_STATUS_CHOICES)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.subject

我想知道是否可以在NewsletterAdminForm中添加一种允许触发电子邮件的按钮。

管理员.py

from django import forms
from django.contrib import admin
from .models import NewsletterSubscription, Newsletter
from ckeditor.widgets import CKEditorWidget

class NewsletterSubscriptionAdmin(admin.ModelAdmin):
    list_display = ('email', 'datetime', )

class NewsletterAdminForm(forms.ModelForm):
    body = forms.CharField(widget=CKEditorWidget())
    class Meta:
        model = Newsletter
        fields = '__all__'

class NewsletterAdmin(admin.ModelAdmin):
    form = NewsletterAdminForm

admin.site.register(NewsletterSubscription, NewsletterSubscriptionAdmin)
admin.site.register(Newsletter, NewsletterAdmin)

提前感谢您提供的任何帮助。

标签: djangodjango-admin

解决方案


要在管理面板中获取按钮,您可以简单地创建一个返回 html 的方法:

class NewsletterAdmin(admin.ModelAdmin):
    ...

    readonly_fields = ['send_mails']

    def send_mails(self, obj):
        url_red = 'url_of_your_view_to_send_mails'
        return format_html(
            '<a class="button" href="{}">Send</a>&nbsp;',
            url_red,
        )

然后,这将呈现为管理页面中的一个按钮,该按钮将向视图提供的 url 发送一个 GET 请求,您可以在其中定义所有逻辑并发送邮件。请务必在fields属性中包含此自定义字段。

希望能帮助到你。


推荐阅读