Python 自定义django管理站点-行内按钮
假设我有一个这样的模型:Python 自定义django管理站点-行内按钮,python,django,Python,Django,假设我有一个这样的模型: class Foo(models.Model): name = models.CharField(max_length=50) year = models.IntegerField(max_length=4) some_value = models.IntegerField(default=0) 及 然后,我使用FooAdmin类在django AdminSite中注册我的模型: class FooAdmin(admin.ModelAdmin)
class Foo(models.Model):
name = models.CharField(max_length=50)
year = models.IntegerField(max_length=4)
some_value = models.IntegerField(default=0)
及
然后,我使用FooAdmin类在django AdminSite中注册我的模型:
class FooAdmin(admin.ModelAdmin):
list_display = ['name', 'year', 'some_value']
class FooAdmin(admin.ModelAdmin):
list_display = ['name', 'year', 'some_value']
class Media:
js = ("/media/javascript/yourjs.js",)
它工作得很好,但出于某种原因,我需要为我的管理站点中的每个Foo行添加两个按钮。比如说,我把它们叫做“相关按钮”和“行动按钮”
我需要这些按钮位于每一行中,并按如下方式操作:-当用户单击“Related_按钮”时,他将被重定向到django管理站点,其中列出了与特定Foo对象相关的所有栏
-当用户单击“Action_button”时,Foo类对象中的某个值字段被设置为自定义值,比如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']
def按钮(self,obj):
返回
button.short_description='Action'
button.allow_tags=True
列表显示=[“名称”、“年份”、“某些值”、“操作”]
在my FooAdmin中,这会导致每行出现一个按钮。但是如何设置该按钮的操作?将自定义js添加到管理类:
class FooAdmin(admin.ModelAdmin):
list_display = ['name', 'year', 'some_value']
class FooAdmin(admin.ModelAdmin):
list_display = ['name', 'year', 'some_value']
class Media:
js = ("/media/javascript/yourjs.js",)
列表页是一个表单
<form id="changelist-form" action="" method="post">
但是,如果您希望比管理操作更灵活,可以为管理员编写自定义视图。管理员由Django本身提供支持,您可以编写自定义视图,将其挂接到身份验证系统中,检查权限并执行任何其他需要执行的操作。事情是这样的:
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, ...]
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
Foo类(models.Model):
...
定义我的行动链接(自我、obj):
返回“%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. :)
class FooAdmin(admin.ModelAdmin):
...
列表显示=['name','my_action_link',…]
def get_URL(自):
url=super(FooAdmin,self).get\u url()
我的URL=模式(“”,
(r'^my\u custom\u action/(?P\d+/$),self.my\u视图)
)
返回我的URL+URL
@需要权限('foo.can\u change')
定义我的视图(自我、请求):
obj=获取对象或404(Foo,pk=pk)
目标做某事
#重定向回更改列表。还是别的什么?
#您可以在此视图中添加一些模型表单。:)
我没有测试这个代码。但我希望你能明白。快乐的黑客
[已编辑]:链接引用Django 1.6 URL不再工作。添加了Django 1.11 URL您能再写些什么吗?不幸的是,我不懂java脚本。它应该解决我的哪一个问题?谢谢,太好了!但我担心一件事——我还在FooAdmin中修改了queryset方法,如下所示:return Foo.objects.filter(created_by=request.user)。我的_视图是在筛选集中查找Foo对象,还是直接从数据库中检索?我不想让我的用户看到他不允许看到的东西。我猜你的用户可能在摆弄url。但是您可以这样做:
obj=get\u object\u或_404(Foo,pk=pk,created\u by=request.user)
如果obj不是由该用户创建的,它将引发404。当然还有其他方法。检查并返回有用的消息:if request.user!=obj.created_by:return“将报告此事件。”
回答您的评论问题:这是一个常规视图,将查询数据库。这与管理qs方法无关。谢谢。最后一个问题:是否可以更改django管理操作,使其作为按钮而不是上面显示的菜单工作?