Отображение подмножеств объектов для «Многие ко многим» в шаблоне Django - PullRequest
0 голосов
/ 19 апреля 2011

Вот как выглядит часть моих моделей:

class Character(models.Model):
    name = models.CharFied()

class Issue(models.Model):
    character = models.ManyToManyField(Character, related_name="appearances", blank=True, null=True)

Что я пытаюсь сделать, так это то, что при переходе на страницу персонажа отображаются все проблемы, в которых находится персонаж.

Вот как настроен мой взгляд:

def character(request, character_slug):
    character = get_object_or_404(Character, slug=character_slug)            
    return render_to_response('comics2/character_detail.html', {'character': character}, context_instance=RequestContext(request)

В шаблоне:

{{ character.name }}

работает

Я пробовал это:

class CharactersView(ListView):
    context_object_name = "character_list"
    template_name = "comics2/character_detail.html"    
    def get_queryset(self):
        character = get_object_or_404(Character, slug=self.kwargs['character_slug'])
        return Issue.objects.filter(character=character)

Но это не работает ..

Но как мне поступить в шаблоне, отображающем все проблемы, в которых появился персонаж? Например:

Character Name
Issue #1
Issue #2,
etc.

Я чувствую, что это что-то очень простое, но я не понимаю. Я искал в Интернете ответы, но не могу найти вещи, которые работают. Итак, дайте мне знать, что происходит, и я предпочитаю детскую беседу и, возможно, реальный код ... спасибо!

1 Ответ

3 голосов
/ 19 апреля 2011

Вы ищете following a relationship backwards

{% for issue in character.appearances.all %}
    {{ issue }}
{% endfor %}

, поскольку вы устанавливаете связанное имя, в противном случае character.issue_set.all является значением по умолчанию. Вы также можете добавить проблемы в контекст, получив соответствующий набор в представлении.

полный пример:

models.py

class Character(models.Model):
    name = models.CharField()
    slug = models.SlugField()

    def __unicode__(self):
        return "%s" % self.name

class Issue(models.Model):
    title = models.CharField()
    volume = models.IntegerField()
    character = models.ManyToManyField(Character, related_name="appearances", blank=True, null=True)

    def get_absolute_url(self):
        ...

views.py

def character(request, character_slug):
    character = get_object_or_404(Character, slug=character_slug)
    issues = character.appearances.all()

    context = {'character': character,
               'issues':issues,}                           

    return render_to_response('comics2/character_detail.html', 
        context_instance=RequestContext(request)

template.html

<h1>Appearances of {{ character }}<h1>
<table>
    <thead>
        <tr>
            <th>Title</th>
            <th>Volume</th>
        </tr>
    </thead>
    <tbody>
        {% for issue in issues %}
        <tr>
            <td><a href="{{ issue.get_absolute_url }}>{{ issue.title }}</a></td>
            <td>{{ issue.volume }}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...