自定义django管理站点 - 行按钮

 手机用户2602926791 发布于 2023-02-10 13:56

假设我有这样的模型:

class Foo(models.Model):
    name = models.CharField(max_length=50)
    year = models.IntegerField(max_length=4)
    some_value = models.IntegerField(default=0)

class Bar(models.Model)
    name = models.CharField(max_length=50)
    foo = models.ForeignKey(Foo)

然后我使用FooAdmin类在django AdminSite中注册我的模型:

class FooAdmin(admin.ModelAdmin):
    list_display = ['name', 'year', 'some_value']

它运行正常,但由于某种原因,我需要为我的管理站点中的每个Foo行添加两个按钮.假设我称之为'Related_button'和'Action_button'

我需要这些按钮位于每一行并且行为如下:
- 当用户点击'Related_button'时,他被重定向到django管理站点,其中列出了与特定Foo对象相关的所有Bars
- 当用户点击'Action_button'时,类Foo的对象中的字段some_value被设置为自定义值,假设为15.但在此之前,确认弹出窗口(是否确定?是/否)应该出现.

怎么做?我发现我可以做类似的事情:

def button(self, obj):
    return ''''''
button.short_description = 'Action'
button.allow_tags = True
list_display = ['name', 'year', 'some_value', 'action']

在我的FooAdmin中导致按钮出现在每一行中.但是如何为该按钮设置操作?

1 个回答
  • 列表页面是一个表单.

    <form id="changelist-form" action="" method="post">
    

    向其添加按钮将提交表单.要使用formdata执行某些操作,您必须创建自定义管理表单.它会变脏,因为它是包含所有显示行的fromset,而不仅仅是你的单行.我想它可以做到,但有更好的方法:

    大多数时候Admin Actions都会做得很好.管理员操作如下所示:

    管理员行动

    def rename_action(modeladmin, request, queryset):
        queryset.update(name='Ni')
    make_published.short_description = "Rename selected objects to 'Ni'"
    
    class FooAdmin(admin.ModelAdmin):
        actions = [rename_action, ...]
    

    但是,如果您想要比管理员操作更灵活,请随意为管理员编写自定义视图.管理员由Django本身提供支持,您可以编写挂钩到身份验证系统的自定义视图,检查权限并执行他们需要执行的任何操作.它是这样的:

    class Foo(models.Model):
        ...
    
        def my_action_link(self, obj):
            return '<a href="/admin/app/foo/my_custom_action/%d/" class="link">Action name</a>' %obj.id
        my_action_link.short_description = 'My action'
        my_action_link.allow_tags = True
    

    现在,我的操作是指向某个自定义网址和自定义管理视图的链接.创建自定义管理视图:

    class FooAdmin(admin.ModelAdmin):
        ...
    
        list_display = ['name', 'my_action_link', ...]
    
        def get_urls(self):
            urls = super(FooAdmin, self).get_urls()
            my_urls = patterns('',
                (r'^my_custom_action/(?P<pk>\d+)/$', self.my_view)
            )
            return my_urls + urls
    
        @permission_required('foo.can_change')
        def my_view(self, request):
            obj = get_object_or_404(Foo, pk=pk)
            obj.do_something()
            # Redirect back to the change list. Or something else?
            # You could add some modelform to this view. :)
    

    我没有测试这段代码.但我希望你明白这个主意.快乐的黑客!

    [已编辑]:链接参考Django 1.6网址不再有效.添加了Django 1.11 URL

    2023-02-10 13:58 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有