Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义django管理站点-行内按钮_Python_Django - Fatal编程技术网

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管理操作,使其作为按钮而不是上面显示的菜单工作?