簡體   English   中英

Django對象不可迭代,為什么?

[英]Django object not iterable, why?

如果他使用ajax單擊“ i want join按鈕,我想顯示username 我有看起來像這樣的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")
       }
   });
});

它的代碼有效,並將所需的內容寫入數據庫,但是它返回給我500錯誤代碼,並帶有TypeError: 'WhoComeOnEvent' object is not iterable 我不明白有什么問題

這是我的模型:

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 ,我使用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中顯示用戶的鏈接

如果您看到此條件是否成立:

if request.is_ajax()

然后who_come將成為WhoComeOnEvent.objects.create對象,這不是可迭代的!

在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中ID為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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM