Как я могу использовать токен csrf в настроенном админе модели django? - PullRequest
0 голосов
/ 14 июня 2019

Я работаю в простом проекте Django и хочу добавить кнопку для каждого объекта модели в админке, и я могу создать ее с помощью этого:
в 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 %'

Так как можно решить эту ошибку?или есть другой способ добавить функциональность к моей кнопке подтверждения?

Ответы [ 2 ]

0 голосов
/ 15 июня 2019
Решение

, предоставленное @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/

0 голосов
/ 14 июня 2019

Если вы говорите о создании нового действия для каждой модели, вы можете сделать что-то вроде этого:

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')
...