【问题标题】:Django: TypeError: 'Like' object is not iterable (Ajax request)Django:TypeError:'Like' 对象不可迭代(Ajax 请求)
【发布时间】:2014-03-31 00:08:24
【问题描述】:

关于 Model (Like) 对象不可迭代,我没有清楚的了解。

错误

liked, created = Like.objects.create(question=create_id)
TypeError: 'Like' object is not iterable

model.py

class Question(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length= 200)
    description = models.TextField()
    location = models.CharField(max_length=150)
    tags = TaggableManager()
    time = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.title


class Like(models.Model):
    user = models.ManyToManyField(User, related_name='likes')
    question = models.ForeignKey(Question)
    date = models.DateTimeField(auto_now_add=True)
    likecount = models.IntegerField(default=0)

urls.py

 url(r'^like/$', 'apps.question.views.like', name='like'),

views.py

def like(request):
    vars = {}
    if request.method == 'POST':
        user = request.user
        tutorial_id = request.POST.get('tutorial_id', None)
        create_id = get_object_or_404(Question, id=tutorial_id)

        liked, created = Like.objects.create(question=create_id)

        try:
            user_liked = Like.objects.get(question=create_id, user=user)
        except:
            user_liked = None

        if user_liked:
            user_liked.likecount -= 1
            liked.user.remove(request.user)
            user_liked.save()
        else:
            liked.user.add(request.user)
            liked.likecount += 1
            liked.save()

    return HttpResponse(simplejson.dumps(vars, user),
                    mimetype='application/javascript')

模板

<button type="button" class="btn btn-request" name="{{question.id}}" id="like">Request</button>

<script>
  $('#like').click(function(){

        $.ajax({
                 type: "POST",
                 url: "{% url 'like' %}",
                 data: {'tutorial_id': $(this).attr('name'), 'csrfmiddlewaretoken': '{{csrf_token}}'},

                 dataType: "text",
                 success: function(response) {
                        alert('You liked this')
                  },
                  error: function(rs, e) {
                        alert(rs.responseText);
                  }
            }); 
      })
  </script>

我在这里缺少什么,谁能解释一下?

谢谢!

【问题讨论】:

  • 我认为你应该在 ajax 请求中给出 datatype = json。
  • 在哪里你得到TypeError异常?
  • total_request 属性(在 views.py 中)有什么作用?
  • @LaundroMat - 这是一个拼写错误。这是一个 likecount 属性。
  • 这不是真正的错误。请显示完整的回溯。

标签: ajax django iterable


【解决方案1】:
Like.objects.create(question=create_id)

返回单个对象(Like)。

所以,like, created = Like.objects.create(question=create_id) 是行不通的,因为右边只有一个项目,所以不能解包(就像你做 like, created = 1 一样)。

返回对象和created布尔对象的方法是get_or_create

like, created = Like.objects.get_or_create(question=create_id)

【讨论】:

  • 感谢您的澄清。但是,如果不同的用户喜欢,那么计数器不会增加。
  • @CodeIgnite 不过,这是您的代码逻辑的问题。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 2013-08-27
  • 2018-01-20
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多