0

Я создаю систему комментариев для своего приложения django, и мне сказали, что лучше всего создать отдельную модель для голосования по комментариям. Так что я сделал это, и вот мой models.py:Невозможно отобразить поля ForeignKey в моем шаблоне

class Comment(models.Model): 
     user = models.ForeignKey(User, default=1) 
     destination = models.CharField(default='1', max_length=12, blank=True) 
     author = models.CharField(max_length=120, blank=True) 
     comment_id = models.IntegerField(default=1) 
     parent_id = models.IntegerField(default=0) 
     comment_text = models.TextField(max_length=350, blank=True) 
     timestamp = models.DateTimeField(default=timezone.now, blank=True) 

     def __str__(self): 
      return self.comment_text 


    class CommentScore(models.Model): 
     user = models.ForeignKey(User, default=1) 
     comment = models.ForeignKey(Comment, related_name='score') 
     upvotes = models.IntegerField(default=0) 
     downvotes = models.IntegerField(default=0) 

     def __str__(self): 
      return str(self.comment) 

Вот мой views.py где создаются комментарии:

def article(request, category, id): 

    name = resolve(request.path).kwargs['category'] 
    for a, b in CATEGORY_CHOICES: 
     if b == name: 
      name = a 
      instance = get_object_or_404(Post, id=id, category=name) 

    allauth_login = LoginForm(request.POST or None) 
    allauth_signup = SignupForm(request.POST or None) 


    #comments 
    comment = CommentForm(request.POST or None) 
    ajax_comment = request.POST.get('text') 
    comment_length = len(str(ajax_comment)) 

    comment_list = Comment.objects.filter(destination=id) 
    score = CommentScore.objects.filter(comment=comment_list) 

    if request.is_ajax(): 
     if comment.is_valid(): 
      comment = Comment.objects.create(comment_text=ajax_comment, author=str(request.user), destination=id) 
      print(comment) 
      comment.save() 

      score = CommentScore.objects.create(comment=comment) 
      score.save() 
      username = str(request.user) 
      return JsonResponse({'text': ajax_comment, 'text_length': comment_length, 'username': username}) 
     else: 
      print(comment.errors) 

    context = { 
     'score': score, 
     'comment_list': comment_list, 
     'comment': comment, 
     'instance': instance, 
     'allauth_login': allauth_login, 
     'allauth_signup': allauth_signup 
    } 

    return render(request, 'article.html', context) 

Так comment работает отлично, но, как вы можете увидеть пару строк позже, я пытаюсь создать экземпляр CommentScore для соответствия с comment. В моем шаблоне я обработал каждый комментарий и его поля (comment_text, author и т. Д.), Но я хочу отобразить поле upvotes, связанное с этим comment. Как мне это сделать?

шаблон

{% for i in comment_list %} 
    <div class='comment_div'> 
     <h3>{{ i.author }}</h3> 
     <p>{{ i.comment_text }}</p><br> 
    </div> 
{% endfor %} 

forms.py

class CommentForm(forms.ModelForm): 
    class Meta: 
     model = Comment 

     fields = [ 
      'comment_text', 
      'id', 
      'author', 
      'destination', 
     ] 

Я уже пробовал следующие, и они не работали;

{% for i in comment_list %} 
    <div class='comment_div'> 
     <h3>{{ i.author }}</h3> 
     <p>{{ i.comment_text }}</p><br> 
      {% for i in comment_list.score_set.all %} 
       {{ i.upvotes }} #renders nothing 
      {% endfor %} 
    </div> 
{% endfor %} 

{% for i in comment_list %} 
    <div class='comment_div'> 
     <h3>{{ i.author }}</h3> 
     <p>{{ i.comment_text }}</p><br> 
      {% for j in i.score %} 
       {{ j.upvotes }} #Error: 'RelatedManager' object is not iterable 
      {% endfor %} 
    </div> 
{% endfor %} 

Имеет много проблем, поэтому помощь приветствуется.

+0

Попробуйте изменить «j.upvotes» на «j.upvotes.all» –

+0

Я получаю ту же ошибку. – Zorgan

+1

Возможно, попробуйте изменить «i.score» на «i.score.all». Эта ошибка RelatedManaager обычно возникает, когда вы пытаетесь выполнить итерацию над менеджером, а не объекты, выбранные этим менеджером. –

ответ

2

Изменение «i.score» на «i.score.all» устраняет проблему, поскольку ошибка RelatedManaager обычно возникает, когда вы пытаетесь выполнить итерацию по диспетчеру, а не объекты, выбранные этим менеджером. - решаемые @ Джо-J

Так что теперь работает, но если кто-то может объяснить, 2-й линии этого синтаксиса, который было бы здорово:

comment_list = Comment.objects.filter(destination=id) 
score = CommentScore.objects.filter(comment=comment_list) 

Что именно происходит, когда я задаю comment=comment_list здесь? Я скопировал этот код у кого-то другого, но я все еще не уверен, как он работает.

 Смежные вопросы

  • Нет связанных вопросов^_^