我有一个POST请求,在提交表单时将数据传递给我的数据库。
照片我的意思是:
home.html的
<script type="text/javascript">
$(document).ready(function(){
var postForm = $(".form-post")
//POSTING DATA INTO DATABASE
postForm.submit(function(event){
event.preventDefault();
var thisForm =$(this)
var actionEndPoint = thisForm.attr("action");
var httpMethod = thisForm.attr("method");
var formData = thisForm.serialize();
$.ajax({
url: actionEndPoint,
method: httpMethod,
data: formData,
success:function(data){
console.log(data)
$(".form-post")[0].reset();
//I WANT TO PASS THE NEWLY ADDED DATA TO DISPLAY WITHOUT REFRESH
$.ajax({
type: 'GET',
url: '{% url "postInfo" %}',
dataType : 'json',
success: function(cdata){
$.each(cdata, function(id,posts){
$('#cb').append('<li>' +posts['fields'].title+ ' ' +posts['fields'].body+ '</li>');
});
}
});
},
error:function(errData){
}
})
})
})
</script>
现在它每次添加帖子时都会显示多个相同的帖子。
这是我的看法
views.朋友
def postInfo(request): # GET REQUEST
if request.method == 'GET' and request.is_ajax():
mytitle = Post.objects.all().order_by('-date_posted')
response = serializers.serialize("json", mytitle)
return HttpResponse(response, content_type='application/json')
def posting(request): # POST REQUEST
if request.method == 'POST' and request.is_ajax():
title = request.POST.get('postTitle')
content = request.POST.get('postContent')
post = Post()
post.title = title
post.body = content
post.author = request.user
post.save()
return HttpResponse('')
models.朋友
class Post(models.Model):
title = models.CharField(max_length=50)
body = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
我怎样才能这样做它只是显示我添加的帖子+数据库中的内容没有显示多个相同的帖子?谢谢你的帮助。
您正在获得倍数,因为您要求在POST请求成功时发送数据库中的每个帖子。
假设cdata
是一个数组,你可以做类似的事情
let innerHtml;
cdata.forEach(function(obj) {
innerHtml.append(`<li>${data['fields'].title} ${data['fields'].body}</li>`);
});
$('#cb').html(innerHtml);
$('#cb').html(...)
将替换元素的HTML内容而不是添加它,因此您不会获得任何重复的条目。在template literal方法中使用append
也可以使事情变得更清洁。
或者你只需发送你刚刚在posting
视图中创建的帖子就是HttpResponse
。当您减少提交表单时发出的请求数量时,这也会更快。
views.朋友
# Other endpoints
...
def posting(request): # POST REQUEST
if request.method == 'POST' and request.is_ajax():
title = request.POST.get('postTitle')
content = request.POST.get('postContent')
post = Post()
post.title = title
post.body = content
post.author = request.user
post.save()
# Send new post as response
response = serializers.serialize('json', post)
return HttpResponse(response, content_type='application/json')
home.html的
<script type="text/javascript">
$(document).ready(function(){
var postForm = $(".form-post");
// POSTING DATA INTO DATABASE
postForm.submit(function(event){
event.preventDefault();
var thisForm = $(this);
var actionEndPoint = thisForm.attr("action");
var httpMethod = thisForm.attr("method");
var formData = thisForm.serialize();
$.ajax({
url: actionEndPoint,
method: httpMethod,
data: formData,
success: function(data) {
console.log(data);
$(".form-post")[0].reset();
// Add the new post to $('#cb')
$('#cb')
.append(`<li>${data['fields'].title} ${data['fields'].body}</li>`);
},
error: function(errData){
// Do something
}
})
})
})
</script>
您可以让POST
视图返回序列化实例,如下所示。它可能不完全正确,因为我不知道你使用什么序列化,但它应该给你一个想法。
如果您不喜欢这样,您可以在html中将帖子的id作为data-post-id
属性注入,如果它不存在,则只将其附加到$('#cb')
。
def posting(request): # POST REQUEST
if request.method == 'POST' and request.is_ajax():
title = request.POST.get('postTitle')
content = request.POST.get('postContent')
post = Post()
post.title = title
post.body = content
post.author = request.user
post.save()
response = serializers.serialize("json", post)
return HttpResponse(response, content_type='application/json')
$.ajax({
url: actionEndPoint,
method: httpMethod,
data: formData,
success:function(data){
console.log(data)
$(".form-post")[0].reset();
$('#cb').append('<li>' +data['fields'].title+ ' ' +data['fields'].body+ '</li>');
}
});
},
error:function(errData){
}
})