如果他使用ajax点击username
按钮,我想要显示i want join
。
我的html看起来像这样:
<div class="who_come">
<form class="form-inline" role="form" method="post" id="joinToEventForm">
{% csrf_token %}
<p align="left"><b ><button type="submit">I want join</button></b></p></b></p>
</form>
{% for u in who_come %}
<p><a href="profile/{{u.visiter}}">{{u.visiter}}</a></p>
{% endfor %}
</div>
我使用此代码生成我的ajax:
$('#joinToEventForm').on('submit', function(event){
event.preventDefault();
console.log("form submitted!") // sanity check
$.ajax({
type:'POST',
data:{
csrfmiddlewaretoken:'{{ csrf_token }}'
},
success : function () {
alert("You are on Envent")
}
});
});
它的代码有效,并将数据写入我需要的内容,但它返回给我TypeError: 'WhoComeOnEvent' object is not iterable
的500错误代码。我无法理解什么是问题
这是我的模特:
class WhoComeOnEvent(models.Model):
visiter = models.ForeignKey(User, related_name='WhoComeOnEvent')
which_event = models.ForeignKey(Topic, related_name='WhoComeOnEvent')
def __str__(self):
return '%s go to %s' % (self.visiter.username, self.which_event.subject)
这是我的观点:
def p(request, pk):
user = request.user
topic = get_object_or_404(Topic, pk=pk)
post = get_object_or_404(Post, pk=pk)
comment = Comments.objects.filter(pk=pk)
who_come = WhoComeOnEvent.objects.filter(pk=pk)
if request.is_ajax():
who_come = WhoComeOnEvent.objects.create(
visiter=user,
which_event=post.topic
)
if request.method == 'POST':
form = CustomCommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.creator = user
comment.save()
comment = Comments.objects.create(
body=form.cleaned_data.get('body'),
creator=user,
)
return render(request, 'post.html', {'post': post, 'topic': topic, 'comment': comment,
'form': form, 'who_come': who_come})
else:
form = CustomCommentForm()
return render(request, 'post.html', {'post': post, 'topic': topic, 'comment': comment,
'form': form, 'who_come': who_come})
我使用WhoComeOnEvent.objects.filter
,据我所知它可能是可迭代的。我尝试使用__iter__
但它对我没有帮助。我尝试使用object.filter(...).values()
,但它也无济于事。我想可能是我在ajax功能中做错了逻辑。如果这是一个愚蠢的问题,请不要生气,我在生命中第一次使用ajax。
我通过替换
解决了500错误和可迭代问题{% for u in who_come %}
<p><a href="profile/{{u.visiter}}">{{u.visiter}}</a></p>
{% endfor %}
到
{% for u in who_come.visiter.all %}
<p><a href="profile/{{u.username}}">{{u.username}}</a></p>
{% endfor %}
但它不会在html中显示用户链接
答案 0 :(得分:1)
如果您看到,如果这种情况属实:
if request.is_ajax()
然后who_come将成为WhoComeOnEvent.objects.create对象而且它不是可迭代的!
答案 1 :(得分:1)
在AJAX调用之后,你需要发回一些有用的东西来改变HTML。
<强>解决方案强>:
from django.http import HttpResponse
def p(request, pk):
# your existing code
if request.is_ajax():
# change variable name
who_come_obj = # same create code
visitors_usernames = []
for w in who_come:
visitors_usernames.append(w.visiter.username)
return HttpResponse(json.dumps(visitors_usernames))
在Javascript AJAX成功方法中:
$.ajax({
...
success: function(data) {
//seems more useful try to use convertation
var to_json = JSON.stringify(data);
var usernames = JSON.parse(to_json);
var html_str = '';
for (var i=0; i < usernames.length; i++) {
html_str += '<p><a href="profile/' + usernames[i] + '">' + usernames[i] + '</a></p>';
}
$('#who_come_links').html(html_str);
}
});
最后,使用HTML中标识为who_come_links
的div
<div id="who_come_links">
{% for u in who_come %}
<p><a href="profile/{{u.visiter.username}}">{{u.visiter.username}}</a></p>
{% endfor %}
</div>