2011-07-11 12 views
1

私は漫画本データベースで作業していますが、主なカバーとバリアントのカバーがあります。私はすべてのメインカバーを表示するページを持っていますが、出版日の順番でバリアントカバーも組み合わせたいと思います。メイン表紙用ManyToMany Djangoでのモデル/ビューの結合、フィルタリング

class Image(models.Model): 
    CATEGORY_CHOICES = (
    ('Cover', 'Cover'),  
    ('Scan', 'Scan'), 
    ('Other', 'Other'), 
    ) 
    title = models.CharField(max_length=128) 
    number = models.CharField(max_length=20, help_text="Do not include the '#'.") 
    image = models.ImageField(upload_to="images/") 
    category = models.CharField(max_length=10, choices=CATEGORY_CHOICES) 
    ### The variant cover is determined by the category_choice 'Cover'. ### 
    contributor = models.ManyToManyField(Contributor, blank=True, null=True) 
    date_added = models.DateField(auto_now_add=True, auto_now=True)  
    def __unicode__(self): 
     return self.title   
    class Meta: 
     ordering = ['title'] 

class Issue(models.Model): 
    CATEGORY_CHOICES = (
    ('Major', 'Major'),  
    ('Minor', 'Minor'), 
    ('Cameo', 'Cameo'), 
    ('Other', 'Other'), 
    ) 
    title = models.ForeignKey(Title) 
    number = models.CharField(max_length=20, help_text="Do not include the '#'.") 
    pub_date = models.DateField(blank=True, null=True) 
    cover_image = models.ImageField(upload_to="covers/", blank=True, null=True) 
    ### This would be where the main image goes. ^^^ ### 
    images = models.ManyToManyField(Image, related_name="images_inc", blank=True, null=True) 
    ### This is where the variant covers go.^^^ ### 
    has_emma = models.BooleanField(help_text="Check if Emma appears on the cover.") 

私のviews.pyは、次のようになります:

def covers(request): 
    sort_by = request.GET.get('sort', 'pub_date') 
    if sort_by not in ['-date_added', 'date_added', '-pub_date', 'pub_date']: 
     sort_by = '-date_added' 
    issues = Issue.objects.filter(has_emma=True).order_by(sort_by).select_related(depth=1) 
    return render_to_response('comics/covers.html', {'issues': issues}, context_instance=RequestContext(request)) 

しかし、私はバリアントがあまりにもしていないカバーを表示したいと思いますこれは私のモデルの一部がどのように見えるかですcover_image。これを行う方法はありますか?たぶん何かimageで(カバーでImageモデルの)カテゴリをフィルタリング?

私は、もちろん、これを行うことができます。

def variants(request): 
    Issue.objects.filter(has_emma=True).order_by(sort_by).select_related(depth=1) 
    images = Image.objects.filter(category='Cover').order_by('id') 
    return render_to_response('comics/variants.html', {'images': images}, context_instance=RequestContext(request)) 

しかしdef coversがするように、それは私に十分な柔軟性を与えるものではありません、と私は彼らがdef coversのように、PUB_DATEによって結合してソートします。

編集

models.py:

class Image(models.Model): 
    CATEGORY_CHOICES = (
    ('Cover', 'Cover'),  
    ('Scan', 'Scan'), 
    ('Other', 'Other'), 
    ) 
    title = models.CharField(max_length=128) 
    image = models.ImageField(upload_to="images/") 
    category = models.CharField(max_length=10, choices=CATEGORY_CHOICES) 
    date_added = models.DateField(auto_now_add=True, auto_now=True)  
    def __unicode__(self): 
     return self.title   
    class Meta: 
     ordering = ['title'] 


class Issue(models.Model): 
    title = models.ForeignKey(Title) 
    number = models.CharField(max_length=20) 
    ###### 
    has_emma = models.BooleanField(help_text="Check if cover appearance.")  
    cover_image = models.ImageField(upload_to="covers/", blank=True, null=True) 
    images = models.ManyToManyField(Image, related_name="images_inc", blank=True, null=True) 
    ###### 
    def get_images(self): 
     ''' Returns a list of all cover images combined, 
      "main" cover image first. 
     ''' 
     images = [self.cover_image] 
     for image in self.images.filter(category='Cover'): 
      images.append(image.image) 
     return images 

views.py:

def covers(request): 
    sort_by = request.GET.get('sort', '-pub_date') 
    if sort_by not in ['-date_added', 'date_added', '-pub_date', 'pub_date']: 
     sort_by = '-date_added'   
    issues = Issue.objects.filter(has_emma=True).order_by(sort_by) 
    return render_to_response('template.html', {'issues': issues,}, context_instance=RequestContext(request)) 

template.html: {% for issue in issues %}{% for image in issue.get_images %}{{ image.image }}{% endfor %}{% endfor %}は - しかし、{% for issue in issues %} {% for image in issue.get_images %} {{ issue.cover_image }} {% endfor %} {% endfor %}繰り返しますが、何も表示されませんを表示するモデルImageに分類されているバリアントカバーがある場合はIssueモデルのです。

これを修正してすべてを正しく表示できるようにするにはどうすればよいですか?そして、再び記録のために、私は(Issueモデルから)とを組み合わせてImageモデルを定義して表示します。私が正しくあなたの問題を理解していれば

+0

私はあなたの問題正しいアム'covers()'ビューでレンダリングされたテンプレートのバリアント画像にアクセスすることはできません。 – Tony

+0

私はバリアント画像(category = Coverの 'images = ManyToManyField(Image)')にアクセスし、それらを 'cover_image'と組み合わせて' pub_date 'でソートするようにしたいと思います。 – AAA

答えて

0

、それを解決するための1つの方法は、このようなIssueクラスにメソッドを追加することになります。そして、

class Issue(models.Model): 
    # fields... 

    def get_images(self): 
     ''' Returns a list of all cover images combined, 
      "main" cover image first. 
     ''' 
     images = [self.cover_image] 
     for image in self.images.filter(category='Cover'): 
      images.append(image.image) 
     return images 

、あなたのテンプレートでは、あなたはたとえば、{% for image in issue.get_images %}...のために、行うことができます。

(それはあなたが必要とする、そして、まさにない場合は、あなたが達成しようとしているものの一例として、いくつかのテンプレートコードを提供する場合、私が思うに、それは良いでしょう。)

+0

このように? {{問題の画像の%} {0} {0} {0} {0} {0} {0}}}}}そして、私は、問題のモデルで定義されているように、結合された画像が公開日ごとにソートされることを期待しています。 – AAA

+0

はい、この方法で、特定の問題のすべての画像を出力しますが、公開日ごとに画像を並べ替えることはどういう意味ですか? 'Image'モデルには、' Issue'だけにそのようなフィールドはありません...画像が 'date_added'でソートされるべきであるということでしょうか? – Tony

+0

私が上に示したテンプレートタグは何も表示していません。そして、はい、私は 'date_added'を持っていましたが、' Issue'モデルにManyToMany 'Image'を通して' pub_date'をどうにかして接続できることを期待していました。それは可能ですか? – AAA

関連する問題