Django Admin中的自定义操作

bfnvny8b  于 2023-01-03  发布在  Go
关注(0)|答案(5)|浏览(166)

在我的Django应用中,我有一个新闻稿模型。现在我希望能够从Django管理员***发送***新闻稿(甚至***重发***新闻稿)。
我可以在Model.save()方法上使用一个钩子来实现这一点,但是有没有其他不绑定到Model的方法呢?
谢谢。

bihw5rsg

bihw5rsg1#

管理员操作允许您轻松地挂接自定义操作,这些操作可以在管理员列表页面中的选定项目上执行。

arknldoa

arknldoa2#

如果你是从admin中进行的,那么你需要覆盖保存()方法,但是它可以是AdminModel的save...不需要是完整的Model save。
但是,如果您要发送大量电子邮件,更好的方法是安装django-mailer,它可以将电子邮件放入队列中以供稍后处理,然后为您提供一个新的管理命令:发送电子邮件。
所以一旦你准备好发送新闻稿,你可以手动运行python manage.py send_mail,任何有错误的邮件都会被移到一个延迟队列中,你可以稍后重试发送。
您可以通过从cron运行manage.py send_mail来自动执行此操作。
如果你真的想在管理员站点上做这件事,安装django-chronograph并在那里设置你的send_mail时间表。

hivapdat

hivapdat3#

你可以试试这个https://www.youtube.com/watch?v=WvL1cR2MgLI
刚改

def available (modeladmin,request,queryset):
    queryset.update(status='ava')

def not_available (modeladmin,request,queryset):
    queryset.update(status='not')

变成了

def send(modeladmin, request, queryset):

    for data in queryset:

        subject=data.title
        message=data.mesage
       

        for d in Users.objects.filter(newsletter=True):
            email=d.email
            

            sendemail = EmailMessage(subject, message+unsubscribe,    'emailo@mdjangotutsme.com',
                [email], [],
                headers = {'Reply-To': 'emailo@mdjangotutsme.com'})

            sendemail.content_subtype = "html" 
            
            sendemail.send()
5w9g7ksd

5w9g7ksd4#

2022更新:

django.__version__ == 4.1或者更早。
您可以通过重写django.contrib.admin.options.ModelAdmin._changeform_view/admin/.../change处添加自定义操作:

from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 

    def _changeform_view(self, request, object_id, form_url, extra_context):

        if '<your-action>' in request: 
            # 1. check permissions
            # 2. do your thing 
            print(request)
        
        return super()._changeform_view(request, object_id, form_url, extra_context)

现在可以使用自定义操作在表单中添加简单的sumbit按钮:

<input type="submit" name="<your-action>" value="<button-title>">

优势

  • 完全没有JavaScript。
  • 身份验证(CSRF)受保护。
  • 所有库存管理操作都将与您的表单一起工作(添加、保存和继续...)
4dbbbstv

4dbbbstv5#

你可以创建自定义django管理操作
例如,我有下面的**Person型号**:

# "store/models.py"

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=30)
    
    def __str__(self):
        return self.name

现在,我在**Person admin中创建了uppercase()lowercase()管理操作**,如下所示。要显示**uppercase()lowercase()管理操作**,必须使用 * actions = ["uppercase", "lowercase"]

# "store/admin.py"

from django.contrib import admin, messages
from .models import Person

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    
    actions = ["uppercase", "lowercase"] # Necessary 
    
    @admin.action(description='Make selected persons uppercase')
    def uppercase(modeladmin, request, queryset):
        for obj in queryset:
            obj.name = obj.name.upper()
            obj.save()
            messages.success(request, "Successfully made uppercase!")

    @admin.action(description='Make selected persons lowercase')
    def lowercase(modeladmin, request, queryset):
        for obj in queryset:
            obj.name = obj.name.lower()
            obj.save()
            messages.success(request, "Successfully made lowercase!")

然后,如果我选择了2个人,并将所选人员变为大写,然后单击Go,如下所示:

我可以将两个人大写如下所示:

然后,如果我选择了2个人,并使所选人员小写,然后单击Go,如下所示:

我可以将两个人小写如下所示:

此外,如果我删除@admin.action(),如下所示

# "store/admin.py"
    
    # ...
    
    # @admin.action(description='Make selected persons uppercase')
    def uppercase(modeladmin, request, queryset):
        for obj in queryset:
            obj.name = obj.name.upper()
            obj.save()
            messages.success(request, "Successfully made uppercase!")

    # @admin.action(description='Make selected persons lowercase')
    def lowercase(modeladmin, request, queryset):
        for obj in queryset:
            obj.name = obj.name.lower()
            obj.save()
            messages.success(request, "Successfully made lowercase!")

实际函数名称显示如下:

相关问题