2016-10-21 6 views
0

私は、管理者のリピーターモデル(画像)を取得できるように、外部キーを持つ2つのモデルを1対多の関係に持っています。画像リピータはうまく動作しますが、私の問題は、フィルムポスト/オブジェクトの1つに保存されたフィールドの画像がすべてのフィルムポストで繰り返されることです。ここで すべての詳細ビューに表示されるリピーターオブジェクト - django

は私のコードです:

model.py

from __future__ import unicode_literals 
from django.db import models 
from embed_video.fields import EmbedVideoField 
from sorl.thumbnail import ImageField 

class Timestamp(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    updated = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

# Film Model 
class Film(Timestamp): 
    title = models.CharField(max_length=255) 
    order = models.PositiveIntegerField(default=0, blank=False, null=False) 
    meta_description = models.TextField('Meta Description', max_length=170, 
     help_text='Content for description meta tag - Max 170 Characters') 
    slug = models.SlugField(unique=True) 
    image = models.ImageField(upload_to='thumb') 
    video = EmbedVideoField(blank=True) 
    director = models.CharField(max_length=255,blank=True) 
    cinematographer = models.CharField(max_length=255,blank=True) 
    producer = models.CharField(max_length=255,blank=True) 

    publish = models.BooleanField(default=False) 
    date_published = models.DateTimeField() 

    # thumb for admin 
    def image_thumb(self): 
     return '<img src="%s" height="200" width="300"/>' % (self.image.url) 
    image_thumb.short_description = 'Image' 
    image_thumb.allow_tags = True 

    # override the admin name + add ordering 
    class Meta(object): 
     ordering = ('order',) 
     verbose_name_plural = "Film Projects" 

    def __unicode__(self): 
     return self.title 

    # helper method 
    def get_absolute_url(self): 
     return "/film/%s/" % self.slug 

    def save(self, *args, **kwargs): 
      super(Film, self).save(*args, **kwargs) 

# Film Stills Image Model 
class FilmStillsImage(models.Model): 
    video_stills = models.FileField(upload_to = 'images') 
    film = models.ForeignKey(Film) 

    class Meta(object): 
     verbose_name_plural = "Film Stills" 

views.py

# film single 
def film_detail(request, slug): 

    film = get_object_or_404(Film, slug=slug) 

    # get all repeater images 
    film_grabs = FilmStillsImage.objects.all() 

    try: 
     next_film = film.get_next_by_date_published() 
    except Film.DoesNotExist: 
     next_film = None 

    try: 
     previous_film = film.get_previous_by_date_published() 
    except Film.DoesNotExist: 
     previous_film = None 

    return render(request, 'film/film_detail.html', { 
     'film': film, 
     'film_grabs': film_grabs, 
     'next_film': next_film, 
     'previous_film': previous_film 
    }) 

film_detail.html

  <div class="section project-stills"> 
       {% if film_grabs %} 
       <div class="row"> 
         {% for filmstillsimage in film_grabs %} 
         <div class="grid-item four"> 
          {% thumbnail filmstillsimage.video_stills "600x338" crop="center" as im %} 
           <img src="{{ im.url }}"> 
          {% endthumbnail %} 
         </div> 
         {% if forloop.counter|divisibleby:4 %} 
        </div> 
       <div class="row"> 
        {% endif %} 
         {% endfor %} 
       </div> 
       {% else %} 
        <p>Nothing found.</p> 
       {% endif %} 
      </div> 

admin.py

class FilmStillsImageAdmin(admin.ModelAdmin): 
    pass 

class FilmStillsImageInline(admin.StackedInline): 
    model = FilmStillsImage 
    max_num = 8 
    extra = 0 

class FilmAdmin(SortableAdminMixin, admin.ModelAdmin): 
    model = Film 
    list_display = ('title', 'meta_description', 'image_thumb', 'video', 'director', 'cinematographer', 'producer',) 

    inlines = [FilmStillsImageInline] 

    prepopulated_fields = {'slug': ('title',)} 

私は確信していますが、私は私の意見でobjects.all()のために感じて、各項目にそれを設定します。

愚かな質問と助けてくれてありがとう!

+0

これは明らかではありませんが、私は恐れています。 * *どこの映画の画像が繰り返されていますか? –

+0

私は明確でない場合は申し訳ありません。関連項目 'video_stills'の画像は、各項目に保存されていなくても、すべてのフィルムアイテムまたは投稿(詳細ビュー)に表示されます。私はそれが理にかなったことを願う – darcemac

答えて

0

すべてのフィルムグラブをディテールテンプレートに渡しているので、自然に表示されます。

FilmStillsImage

<div class="section project-stills"> 
     <div class="row"> 
      {% for filmstillsimage in film.filmstillsimage_set.all %} 
       .... 

をし、まったくビューからfilm_grabsを渡す必要はありません。代わりにそれを行うのは、あなただけ実際に関連しているものを表示するには、テンプレート内の逆の関係に従ってください。

+0

Danielさん、ありがとう、本当にありがとう、伝説!!ちょっと別の質問ですが、私のアプローチは画像を管理者にアップロードを繰り返す最善の方法ですか?もう一度乾杯! – darcemac

+0

「リピートアップロード」とは何を意味するのかよく分かりませんが、これは1対多の関係を持つ標準的な方法です。 –

+0

私は、1対多の関係を使用して、管理者経由で複数の画像をアップロードすることを意味しました。私はdjangoの新人ですし、WPのために来て、彼らはこの機能を提供するための高度なカスタムフィールドのプラグインを持っている... – darcemac

関連する問題