Showing one-to-many relationship in Django views

I am making a django blog and want to show a list of comments for each blog post, but I have trouble figuring out how to reference the comments in the views and the templates. My models are defined like this:

class Issue(models.Model):
    title = models.CharField(max_length=255)
    text = models.TextField()
    author = models.ForeignKey(User)

    def __unicode__(self):
        return self.title

class Comment(models.Model):
    commenter = models.ForeignKey(User)
    issue = models.ForeignKey(Issue)
    text = models.TextField()

and my views like this

class IssueDetail(DetailView):
    model = Issue
    context_object_name = "issue"
    template_name = "issue_detail.html"

    def get_context_data(self, **kwargs):
        context = super(IssueDetail, self).get_context_data(**kwargs)
        context['comments'] = Comment.objects.all()
        return context

class CommentDetail(DetailView):
    model = Comment
    context_object_name = "comment"
    template_name = "comment_detail.html"

and finally the issue_detail.html template

{% block content %}
  <h2>{{ issue.title }}</h2>
        <br/>
        <i>As written by {{ issue.author.first_name }}</i>
        <br/><br/>
        <blockquote> {{ issue.text }}</blockquote>
        <h3>Comments</h3>
        {% for comment in comments %}
            <li>{{comment}}</li>
        {% endfor %}
{% endblock %}

This allows me to reference the fields of the comment inside the Issue template, but basically then I want the comments to have a template of their own that will be rendered inside the for loop. What is the correct way to do this in Django?


Solution 1:

The comments are already available in your template because of the model relationship you defined. You can delete the get_context_data in IssueDetail.

Your issue_detail.html template could look like this:

{% for comment in issue.comment_set.all %}
  {% include 'comment_detail.html' %}    
{% endfor %}

Your comment_detail.html template could look like this:

<ul>
    <li>{{ comment.issue }}</li>
    <li>{{ comment.text }}</li>
</ul>