【发布时间】:2021-01-19 05:19:26
【问题描述】:
我想我会在这里问这个,因为我不太确定我哪里出错了。我正在尝试使用 Django Rest Framework 类通过 AJAX 发出 POST 请求。但是,每当事件触发时,我都会收到以下错误:
OST http://127.0.0.1:8000/api/uservenue/ 400 (Bad Request)
这是堆栈跟踪中出现的内容:
{"list":["This field is required."],"venue":["This field is required."]}
上下文
我试图做到这一点,当用户单击“添加到列表”按钮时,它会将 cafeName(以及最终的其他详细信息)发送到用户定义的列表。
我想知道是否有人可以查看我的代码并就我哪里出错了给我一些指导?
守则
以下是相关模型:
class UserVenue(models.Model):
venue = models.ForeignKey(mapCafes, on_delete=models.PROTECT)
list = models.ForeignKey(UserList, on_delete=models.PROTECT)
Here is the relevant serializer.py
class UserVenueSerializer(serializers.ModelSerializer):
class Meta:
model = UserVenue
fields = ['list', 'venue']
这里是相关的网址
router = DefaultRouter() #need help understanding router register
router.register('userlist', views.UserList)
router.register('uservenue', views.UserVenue)
这里是相关的views.py
class UserVenue(viewsets.ModelViewSet):
serializer_class = UserVenueSerializer
queryset = UserVenue.objects.all()
@ensure_csrf_cookie
def get_queryset(self):
cafeName = self.request.GET.get('cafeName', None)
print(cafeName)
return UserVenue.objects.all()
最后,这里是包含 CSRF 代码的 ajax 调用。
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function (xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
$.ajax({
type: "POST",
url : '/api/uservenue/',
//dataType: "json", //I tried using this and commenting it out and it made no diff.
//contentType: "application/json", //I tried using this and commenting it out and it made no diff.
data: {
'cafeName': cafeName,
'list_id': 1,
'csrfmiddlewaretoken': document.querySelector('input[name="csrfmiddlewaretoken"]').value,
},
success: function(data){
//$("user-list").html(data);
console.log('User clicked: ' + data)
},
failure: function(errMsg) {
alert(errMsg);
}
});
我不确定这是 Ajax 中的错误还是我的视图中的错误?
谢谢!
【问题讨论】:
-
这可以很容易地用一个普通的 Django 视图函数来完成——你需要使用 Django 休息框架 Viewset 有什么特别的原因吗?
-
嘿,不完全是。用户创建的列表功能是通过 DRF 完成的,所以我试图保持一致。我对使用 DRF 不知道,正在尝试,因为我还是很新,我收到的一些反馈是使用 DRF。你的意见是什么?
-
让我们从下面的示例开始,并填补可能缺少的空白。
标签: jquery django ajax django-rest-framework