Search code examples
pythondjangotemplatesmany-to-many

How to display a ManyToMany fields in the template


I wonder how I can retrieve my template a ManyToMany fields ... For example, in my model I would like to retrieve the page corresponding to each question and post it in the template ... I have 4 values in my class Page ("visit 1 visit 2 visit 3, 4 .. visit") And I associated in my database each question with a "visit"

And I wish I could now see how visits to any question in my template.

I will share my models:

class Page(models.Model):
    title = models.CharField(max_length=30)


    def __str__(self):
        return self.title

class Question(models.Model):
    label = models.CharField(max_length=30)
    page = models.ManyToManyField(Page)

    def __str__(self):
            return self.label

class Reply(models.Model):
    question = models.ForeignKey(Question)
    user = models.ForeignKey(Personne)
    answer = models.CharField(max_length=30)
    creationDate = models.DateTimeField(default=datetime.datetime(2016, 1, 20, 15, 4, 21, 467165))

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

And my templates :

{% for reply in replies %}<br>
    <br> {{ reply.user }}
    {{ reply.question }} -
    {{ reply.answer }}
    (dans la :{% for page in questions.page %} {{ page }}) {% endfor %}  #this is this line who doesn't work 
{% endfor %}

How do I call in the template page for a given question?

EDIT :

def reply(request):
    replies = Reply.objects.all()
    questions = Question.objects.all()
    logged_user = get_logged_user_from_request(request)
    pages = Page.objects.all()
    form = ReplyBisForm(request.GET)
    personnes = Personne.objects.all()
    if logged_user:
        if len(request.GET) > 0:
            form = ReplyBisForm(request.GET)
            if form.is_valid():
                form.save(commit=True)
                return HttpResponseRedirect('/reply')
            else:
                return render_to_response('polls/reply.html', {'personnes': personnes, 'replies': replies, 'questions': questions,'pages':pages, 'form': form})
        else:
            form = ReplyBisForm()
            return render_to_response('polls/reply.html', {'personnes':personnes, 'replies': replies, 'questions': questions, 'pages':pages, 'form': form})
    else:
    return HttpResponseRedirect('/login')

Solution

  • Since a ManyToMany field is transformed to a RelatedManager for every model instance, you should specify a subset of your related objects, or just go with all():

    (dans la :{% for page in reply.question.page.all %} {{ page }}) {% endfor %}