假设我有这样的模型:
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 '''<input type="button" value="button" />'''
button.short_description = 'Action'
button.allow_tags = True
list_display = ['name', 'year', 'some_value', 'action']
在我的FooAdmin中导致按钮出现在每一行中。但是如何为该按钮设置操作?
答案 0 :(得分:5)
列表页面是一个表格。
<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, ...]
但是如果您想要比Admin 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
现在,我的操作是一个指向某些custom url and custom admin view的链接。创建自定义管理视图:
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
答案 1 :(得分:0)
将自定义js添加到管理类:
class FooAdmin(admin.ModelAdmin):
list_display = ['name', 'year', 'some_value']
class Media:
js = ("/media/javascript/yourjs.js",)