2011-04-19 72 views
0

我打算干掉我下次重建数据库相关的名字......我现在用的模型更加的试验模型。因此,有了Class Creator和作者,cover_artist等,我将如何去展示Creator创建的问题(一旦我摆脱了相关的名称,除非有办法绕过它)?显示具有不同名称的多对多子集?在Django模板

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 %} 

是行不通的。

谢谢。

回答

0

我建议改变你的models.py有问题有许多对造物主一对多的关系,通过另一台,例如角色。请参阅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() 
    ... 

编辑:

在你的问题查看,你会得到不同的角色,并把它传递给你的模板(例如):

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)) 
+0

这似乎有点混乱,因为我不知道如何作用将看在Django的示例模型后作家,艺术家等区分,在模板中。这是我现在为我准备的:http://amlaplant.webfactional.com/comics2/issues/astonishing-x-men-1/ – AAA 2011-04-19 08:30:15

+0

谢谢。这可以让我显示创作者通过模板参与的问题吗?我会怎么做呢? – AAA 2011-04-19 09:24:21

+0

是的。问题相同。 – DTing 2011-04-19 11:17:07