【发布时间】:2016-04-05 18:03:11
【问题描述】:
我真的需要一些关于 Ajax 和 Django 的帮助!我正在尝试遍历所有Item 对象,以便每个对象都有一个单独的表单,允许用户使用ajax 按钮favorite 项目。
这是我的表格:
<div class="row">
{% for item in items%}
<div class="col-sm-6 col-md-4">
<div class="thumbnail">
{% if item.photo %}
<img src="{{ MEDIA_URL }}{{item.photo.url}}">
{% endif %}
<div class="caption">
<h3>{{item.name}}</h3>
<p>{{item.description}}</p>
<h3>Price: {{item.price}}</h3>
<h3>Rating: {{item.rating}}</h3>
<p>
<form id="add_favorite_form">
{% csrf_token %}
<button id='fav' class='btn btn-primary' type="submit" data-itemid="{{item.id}}" value="Favorite">
Favorite
<span class="glyphicon glyphicon-thumbs-up"</span></a>
</form>
</p>
</div>
</div>
</div>
{% endfor %}
</div>
这里是 Ajax:
<script type="text/javascript">
$(document).on('submit', '#add_favorite_form',function(e){
e.preventDefault();
var $fav = $('#fav');
$.ajax({
type: "POST",
url: "/items/favorites/",
data: {
id: $($fav).attr('data-itemid'),
csrfmiddlewaretoken:$("input[name=csrfmiddlewaretoken]").val()
},
success: function(){
alert("button works but is broken. Only the first Item instance is added to favorites")
}
});
});
</script>
最后,我的观点:
def favorite_item(request):
favorites, created = Favorite.objects.get_or_create(user=request.user)
if request.method == "POST":
id = request.POST['id']
item = Item.objects.get(id=id)
print item
favorites.items.add(item)
favorites.save()
return HttpResponse(' ')
如您所见,按钮使用{{item.id}} 作为data-* 属性,所以我假设这会将每个item.id 的值传递给ajax 脚本中的变量var $fav = $('#fav');。但是,似乎只传递了第一个 item.id,因为这是添加到 favorites 的唯一 Item 对象。
我该如何解决这个问题?感谢您的帮助。
【问题讨论】:
-
将
fav定义为class而不是id -
@AvinashRaj 没用 :(
-
这是错误的:
{{ MEDIA_URL }}{{item.photo.url}}。如果你正确配置了MEDIA_ROOT和MEDIA_URL,{{item.photo.url}}就足够了(Django 将添加必要的基本路径)。