我有一个引用其他模型的模型,我正在尝试使用ajax保存数据
示例:
class Friend(models.Model):
name = ...
class Main(models.Model):
name = ....
friend = models.ForeignKey(Friend, on_delete=models.CASCADE)
所有主体均来自ajax(fetch)请求
我有一个表格(html),并将数据添加到单元格中,然后使用 输入事件,发送数据。
赞:
input.addEventListener("keyup", function (e) {
//in this scenario I already have the whole row
// get full_row `row_data`
post_ajax = {
method: "POST",
headers: {
"X-CSRFToken": crf_token, // I get it with a regular expression
"Content-Type": "application/json",
"X-Requested-With": "XMLHttpRequest",
Accept: "application/json",
},
body: JSON.stringify(row_data),
};
fetch("my_url", post_ajax)
.then((res) => res.json())
.catch((error) => console.error("Error:", error))
.then((response) => console.log("Success:", response));
});
我的查看功能
def save_post(request):
if request.is_ajax and request.method == "POST":
body_unicode = request.body.decode('utf-8')
data = json.loads(body_unicode)
print('here the data arrives',data)
# here the data arrives {'name': 'Ale', 'friend_id': 22}
Main.objects.create(name=data['name'], friends=data['friend_id'])
return JsonResponse({"instance": data}, status=200)
return JsonResponse({"error": ""}, status=400)
这是错误
raise TypeError("%s() got an unexpected keyword argument '%s'" %
(cls.__name__, kwarg))
TypeError: Main() got an unexpected keyword argument 'Friends'
有什么想法或建议吗?
答案 0 :(得分:2)
编辑:
在创建select max(acount) acount, max(bcount) bcount
from mytable
对象时,请尝试使“ Main
”属性成为对象,例如:
friend
另外,主要问题似乎是您正在呼叫“ 朋友”列,但是在创建friend = Friend.objects.get(id=data['friend_id'])
Main.objects.create(name=data['name'], friend=friend)
时应该是“ friend ”对象。
此:
Main
应该是:
Main.objects.create(name=data['name'], friends=data['friend_id'])
上级答案:
假设您未在模板中使用JQuery发送AJAX请求,
在您的urls.py中:
Main.objects.create(name=data['name'], friend=data['friend_id'])
在您的模板中:
...
path('/api/post_friend/', post_friend_api, name="post_friend_api"),
...
在您的views.py:
<script type="text/javascript">
$("#myBurron").click(function(){
var csrfToken = $( "input[name='csrfmiddlewaretoken']"); // assuming this is a form
var friend_name = $("#friend_name").val();
$.ajax({ url: '{% url 'post_friend_api' %}',
type: "POST",
dataType: "json",
data: {'friend':friend_name, 'csrfmiddlewaretoken':csrfToken.val()},
cache: false
}).done(function(data) {
if (data.result === true){
alert(data.message);
}
});
});
});
</script>
通过POST发送数据时,请不要忘记像上面的示例一样传递CSRF令牌。假设您在页面上有一个表单可以从中获取,否则您可以使用类似的方式获取它:
from django.http import JsonResponse
def post_friend_api(request):
data = {}
if request.POST.get('friend', None) is not None:
friend_name = request.POST.get('post_note')
# save the object and indicate success
data['result'] = True
data['message'] = "Friend saved successfully"
...
if request.is_ajax():
return JsonResponse(data)
else:
return HttpResponseBadRequest()
如果您不想处理CSRF令牌,则可以使用function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
装饰器标记视图,并从模板中的Ajax调用中删除“ @csrf_exempt
”数据元素,但是它可能不是理想的,也不是最安全的。一个例子:
csrfmiddlewaretoken
如果您发布更多详细信息,我可以更新我的答案。