【发布时间】:2021-09-21 13:41:56
【问题描述】:
我使用默认的 Django 管理面板作为我的后端。我有一个 Blogpost 模型。我想做的是每当管理员用户在 Django 管理员上保存 blogpost 对象时,我需要向新闻通讯订阅者发送一封电子邮件,通知他们网站上有一个新博客。
由于django admin是通过调用save函数自动保存博客的,所以不知道在哪里写send email api逻辑。希望我已经解释清楚了。
我的博文:
class BlogPost(models.Model):
author = models.CharField(max_length=64, default='Admin')
CATEGORY_CHOICES = (
('travel_news', 'Travel News',),
('travel_tips', 'Travel Tips',),
('things_to_do', 'Things to Do',),
('places_to_go', 'Places to Go'),
)
image = models.ImageField(blank=True, null=True)
title = models.CharField(max_length=255)
categories = models.CharField(max_length=64, choices=CATEGORY_CHOICES, default='travel_news')
caption = models.CharField(max_length=500)
content = RichTextUploadingField()
# todo support for tags
# tags = models.CharField(max_length=255, default='travel') #todo
tag = models.ManyToManyField(Tag)
date_created = models.DateField()
我已经用这样的模型表单覆盖了 Django 管理表单。
class BlogForm(forms.ModelForm):
CATEGORY_CHOICES = (
('travel_news', 'Travel News',),
('travel_tips', 'Travel Tips',),
('things_to_do', 'Things to Do',),
('places_to_go', 'Places to Go'),
)
# categories = forms.MultipleChoiceField(choices = CATEGORY_CHOICES)
class Meta:
model = BlogPost
fields = ['author','image', 'title','categories',
'caption','content','tag','date_created']
@register(BlogPost)
class BlogPostAdmin(ModelAdmin):
# autocomplete_fields = ['author']
def edit(self, obj):
return format_html('<a class="btn-btn" href="/admin/blogs/blogpost/{}/change/">Change</a>', obj.id)
def delete(self, obj):
return format_html('<a class="btn-btn" href="/admin/blogs/blogpost/{}/delete/">Delete</a>', obj.id)
list_display = ('categories', 'title', 'date_created','edit', 'delete')
icon_name = 'chrome_reader_mode'
# inlines = [TagInline]
form = BlogForm
我写了一个视图,但它没有任何意义,因为没有任何 url 调用它,因为从 django 管理本身保存时我们不需要任何视图和 url。
from apps.blogs.admin import BlogForm
def blogform(request):
if request.method == 'POST':
form = BlogForm(request.POST)
if form.is_valid():
form.save()
如果没有这个逻辑,表单也可以正常工作。
我的订阅者模型:
class Subscribers(models.Model):
email = models.EmailField(unique=True)
date_subscribed = models.DateField(auto_now_add=True)
def __str__(self):
return self.email
class Meta:
verbose_name_plural = "Newsletter Subscribers"
【问题讨论】:
-
override
save博客方法呢?或者只是给bind to post_save signal? -
好的,但是在哪里写保存后的信号调用??还有信号发出后逻辑在哪里写??
-
如果可以解决您的问题,我可以根据信号编写答案。
-
当然。我将尝试实施它。 @daniherrera
-
我刚刚发布了一个包含所有元素的示例:博客、博客文章、信号、send_mail、订阅者……
标签: django api django-rest-framework django-forms django-admin