0

我在一个简单的 Django 项目中工作,我想在 admin 中为每个模型对象添加一个按钮,我可以使用以下方法创建它:
在 admin.py

class RegistrationAdmin(admin.ModelAdmin):
    def button(self, obj):
        isreg = obj.username
        return format_html('<form action="/validate/" method="post">{% csrf_token %}<script>x={{isreg}};</script><button class="btn btn--pill btn--green"'
         ' type="submit">Validate</button></form>', {'isreg': isreg})

    button.short_description = 'Action'
    button.allow_tags = True
    list_display = ['username', 'button']

但是当我执行它时,它给出了关键错误:

KeyError at /admin/myapp/registration/
'% csrf_token %'

那么如何解决这个错误呢?或者有没有其他方法可以为我的验证按钮添加功能?

4

2 回答 2

1

如果您正在谈论为每个实例创建一个新操作,您可以执行以下操作:

from django.conf.urls import url
from django.contrib import admin
from django.http import HttpResponseRedirect
from django.utils.html import format_html

class RegistrationAdmin(admin.ModelAdmin):
    list_display = ['username', 'button']

    def button(self, obj):
        return format_html('<a href="new-action/{}">{}</a>', obj.id, obj.username)

    def get_urls(self):
        urls = super().get_urls()
        my_urls = [
            url(r'^new-action/(?P<id>[0-9]+)$', self.new_action)
        ]
        return my_urls + urls

    def new_action(self, request, id):
        if request.user.is_authenticated:
            # your stuff
            self.message_user(request, 'ID {} successfully processed'.format(id))
        return HttpResponseRedirect('/admin')
于 2019-06-14T17:45:17.187 回答
1

@Danilo Akamine 提供的解决方案对我来说非常有效。但那些有同样问题的人可能需要: url 方法在:

        my_urls = [
            url(r'^new-action/(?P<id>[0-9]+)$', self.new_action)
        ]

属于 django.conf.urls 所以将这一行添加到 admin.py:

from django.conf.urls import url

或者您也可以使用 django.urls 中的路径方法:

  my_urls = [
            path('new-action/<int:id>', self.new_action)
        ]

更多信息:访问 https://docs.djangoproject.com/en/2.2/topics/http/urls/

于 2019-06-15T10:27:30.893 回答