Django对象不可迭代,为什么?

时间:2017-10-16 10:41:09

标签: python ajax django

如果他使用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中显示用户链接

2 个答案:

答案 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>