Отображение множества подмножеств с разными именами? в шаблоне Django - PullRequest
0 голосов
/ 19 апреля 2011

Я планирую избавиться от связанного имени в следующий раз, когда я перестрою базу данных ... модели, которые я использую, больше относятся к тест-моделям. Итак, с Class Creator и автором, cover_artist и т. Д., Как я могу показать проблемы, которые создал Creator (как только я избавлюсь от связанного имени, если нет способа обойти это)?

class Creator(models.Model):
    name = models.CharField(max_length=256)
    desc = models.TextField("description", blank=True, null=True)
    #type = writer, artist, editor, letterer
    slug = models.SlugField(blank=True, null=True)
    def __unicode__(self):
        return self.name
    class Meta:
        ordering = ['name']
    def get_absolute_url(self):
        return "/comics2/creators/%s" % self.slug 


class Issue(models.Model):
    ....
    writer = models.ManyToManyField(Creator, related_name="written by", help_text="Use cmd/ctrl + click to select multiple names. The same applies to the rest of the creators below.", blank=True, null=True)
    artist = models.ManyToManyField(Creator, related_name="drawn by", blank=True, null=True)
    cover_artist = models.ManyToManyField(Creator, related_name="cover drawn by", blank=True, null=True)
    colorist = models.ManyToManyField(Creator, related_name="colored by", blank=True, null=True)
    inker = models.ManyToManyField(Creator, related_name="inked by", blank=True, null=True)
    penciller = models.ManyToManyField(Creator, related_name="pencilled by", blank=True, null=True)
    letterer = models.ManyToManyField(Creator, related_name="lettered by", blank=True, null=True)
    editor = models.ManyToManyField(Creator, related_name="edited by", blank=True, null=True)
    arc = models.ManyToManyField(Arc, related_name="related story arc", blank=True, null=True)
    ...
    def __unicode__(self):
        return u'%s %s' % (self.title, self.number)
    def get_absolute_url(self):
        return "/comics2/issues/%s" % self.slug     
    class Meta:
        ordering = ['title', 'number']
    def get_stars(self):
        star_rating = self.rating * 16
        return star_rating

....

{% for issue in creator.____?__.all %}
<ul>
<li>{{ issue }}</li>
</ul>    
{% endfor %}

не собирается работать.

Спасибо.

1 Ответ

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

Я бы предложил изменить ваш models.py, чтобы у Issue было отношение «многие ко многим» с Creator через другую таблицу, например, «Роль».См. docs здесь.

class Creator(models.Model):
    name = models.CharField(max_length=256)
    desc = models.TextField("description", blank=True, null=True)
    slug = models.SlugField(blank=True, null=True)
    def __unicode__(self):
        return self.name
    class Meta:
        ordering = ['name']
    def get_absolute_url(self):
        return "/comics2/creators/%s" % self.slug 

class Issue(models.Model):
    creators = models.ManyToManyField(Creator, through='Role')
    arc = models.ManyToManyField(Arc, related_name="related story arc", blank=True, null=True)
    ...
    def __unicode__(self):
        return u'%s %s' % (self.title, self.number)
    def get_absolute_url(self):
        return "/comics2/issues/%s" % self.slug     
    class Meta:
        ordering = ['title', 'number']
    def get_stars(self):
        star_rating = self.rating * 16
        return star_rating

class Role(models.Model):
    issue = models.ForeignKey(Issue)
    creator = models.ForeignKey(Creator)
    role = models.CharField()
    ...

edit:

в представлении проблем, вы получите разные роли и передадитеваш шаблон (например):

def issue_detail(request, issue_slug=None):
    issue = get_object_or_404(Issue, slug=creator_slug)
    writers = issue.creators.filter(role__role='writer')
    cover_artists = issue.creators.filter(role__role='cover artist')
    ...

    context = { 'issue': issue,
                'writers': writers,
                'cover_artists': cover_artists,
                ...
               }

    return render_to_response('issue_detail.html', context,
           context_instance=RequestContext(request))

шаблон:

<label>Writers</label>
{% for writer in writers %}
    {{ writer }}
{% endfor %}
<label>Cover Artists</label>
{% for cover_artist in cover_artists %}
    {{ cover_artist }}
{% endfor %}

представление создателя:

def creator_detail(request, issue_slug=None):
    creator = get_object_or_404(Creator, slug=issue_slug)
    issues_as_writer = creator.issue_set.filter(role__role='writer')
    issues_as_cover_artists = creator.issue_set.filter(role__role='cover artist')

    #all issues related to this creator
    all_issues = creator.issue_set.all()
    ...

    context = { 'creator': creator,
                'issues_as_writer': issues_as_writer,
                'issues_as_cover_artist': issues_as_cover_artist,
                ...
                'all_issues': all_issues,
               }

    return render_to_response('creator_detail.html', context,
           context_instance=RequestContext(request))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...