在django小部件中使用csrf_token

时间:2017-12-18 09:17:15

标签: django

我正在尝试使用ajax创建自定义django小部件。 ajax调用需要csrf_token。 我需要知道如何将csrf_token传递给widget html。

# forms.py
from django import forms
from widgets import MyWidget

class PenForm(forms.ModelForm):
    color = forms.CharField(widget=MyWidget)
    class Media:
        js = (
            'js/jquery-3.2.1.min.js',
            'js/jquery-ui.min.js',
        )
        css = {
            'all': (
                'css/jquery-ui.min.css',
            )
        }


# widgets.py
from django.forms.widgets import Widget
from django.template import loader
from django.utils.safestring import mark_safe


class MyWidget(Widget):
    template_name = 'my_widget.html'
    def get_context(self, name, value, attrs={}):
        return {'widget': {
            'name': name,
            'value': value,
            'attrs': attrs,
            'csrf_token': '???'
        }}

    def render(self, name, value, attrs=None):
        context = self.get_context(name, value, attrs)
        template = loader.get_template(self.template_name).render(context)
        return mark_safe(template)

这是我的小部件html:

<script>
  $( function() {
    $( "#autocomplete_{{ widget.name }}" ).autocomplete({
      source: function( request, response ) {
        $.ajax( {
          url: "/get_colors",
          type: "post",
          dataType: "json",
          contentType: "application/json; charset=utf-8",
          headers: {'X-CSRFToken': '{{ csrf_token }}'},
          data: {
            term: request.term
          },
          success: function( data ) {
            response( data );
          }
        } );
      },
      minLength: 1,
      select: function( event, ui ) {
        log.debug( "Selected: " + ui.item.value + " , " + ui.item.id );
      }
    } );
  } );
</script>


# admin.py
@admin.register(Pen)
class PenAdmin(admin.ModelAdmin):
    form = PenForm
    list_display = ['label', 'color']

我已经尝试过使用{{csrf_token}}这不起作用,所以我认为我应该从admin get_queryset(self,request)获取令牌并将其传递给表单,然后将其传递给小部件然后到模板。 如果这个理论是正确的,那么我需要知道如何将令牌传递给小部件。

0 个答案:

没有答案