我正在尝试使用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)获取令牌并将其传递给表单,然后将其传递给小部件然后到模板。 如果这个理论是正确的,那么我需要知道如何将令牌传递给小部件。