Django 管理员定制

Posted

技术标签:

【中文标题】Django 管理员定制【英文标题】:Django Admin Customizing 【发布时间】:2011-08-13 19:08:18 【问题描述】:

我正在设计一个管理界面,邀请邮件将发送给用户。我的邀请模型已准备就绪,并且在我的邀请管理界面中,我可以看到管理员可以发送电子邮件邀请的我添加的用户。

现在我想稍微自定义一下。我想为每一行添加一个SEND 按钮,该按钮实际上会向该用户发送一封电子邮件。发送邮件功能等一切就绪。我不知道如何自定义此管理模板以添加 send 按钮。有人可以帮忙吗??或者至少指出我正确的方向......

P.S:它不必是发送按钮,它可以是“操作”下拉列表的一部分,对于选定的用户,我可以共同发送电子邮件。

【问题讨论】:

【参考方案1】:

关于每一行的发送按钮,您可以为您的模型(或 ModelAdmin)提供一个新函数,该函数返回指向您的视图的相应 html(或调用相应的 AJAX 函数)。只需将您的函数添加到 ModelAdmin 的“list_display”并确保 HTML 标记不会被转义:

class MyModelAdmin(admin.ModelAdmin):
    ...
    list_display = ('name', 'email', 'sender', 'send_email_html')

    def send_email_html(self, obj):
        # example using a javascript function send_email()
        return '<a href="send_email(%s)">Send Now</a>' % obj.id
    send_email_html.short_description = 'Send Email'
    send_email_html.allow_tags = True

关于动作的使用,在您的 ModelAdmin 中将“动作”定义为一个列表,其中包含您的函数,该函数将 modeladmin、request、queryset 作为参数:

def send_email_action(modeladmin, request, queryset):
    whatever_you_want_to_do_with_request_and_queryset
send_email.short_description = 'Send email'

class MyModelAdmin(admin.ModelAdmin):
    ...
    actions = [
        send_email_action
    ]

【讨论】:

酷!这很好。当管理员单击“发送”时,我将如何为此添加功能?基本上点击发送后,整行必须发送到我的send_email_view 发送电子邮件... 抱歉,请重新阅读您的答案。因此,您建议从 javascript 将整行发送到我的send_email_view 的 ajax 路由。还有其他方法吗? 抱歉,暂时没有检查 SO...嗯...您可以为每一行添加一个提交按钮 - 将相应行的对象 ID 放在其名称中 - 然后检查哪个按钮是单击而不是查看选中了哪些复选框。所以基本上喜欢动作,但从按钮名称而不是复选框中读取单个对象。【参考方案2】:

我下面的解决方案是在管理界面中添加“发送邀请”操作

“发送邀请”操作

您可以参考 django admin-actions 文档here。 以下是您的 admin.py 的外观:

from django.contrib import admin
from myapp.models import MyModel
from django.core.mail import send_mail

class MyModelAdmin(admin.ModelAdmin):
    actions = ['send_invite']

    def send_invite(self, request, queryset):
        # the below can be modified according to your application.
        # queryset will hold the instances of your model
        for profile in queryset:
            send_email(subject="Invite", message="Hello", from_eamil='myemail@mydomain.com', recipient_list=[profile.email]) # use your email function here
   send_invite.short_description = "Send invitation"

admin.site.register(MyModel, MyModelAdmin)

我没有测试过这段代码,但它几乎是你所需要的。希望这会有所帮助。

【讨论】:

以上是关于Django 管理员定制的主要内容,如果未能解决你的问题,请参考以下文章

Django开发博客系统(07-根据需求定制管理后台)

Django之admin

Django中使用Celery,定制应用程序中定义的shared_task未在定期任务管理页面的注册任务中显示

如何将标签添加到Django管理员字段

django 框架学习:十六.django 后台管理系统

django-17.admin后台管理