转发器对象出现在所有细节视图上 - django

时间:2016-10-21 10:02:00

标签: django django-models django-admin

我有两个带有外键的模型,一对多关系,这样我就可以在管理员中获得转发器模型(图像)。图像转发器工作正常,我的问题是保存在其中一个电影帖子/对象上的字段图像 - video_stills在所有电影帖子中重复。

这是我的代码:

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(),将它填充到每个项目。

道歉,如果它是一个愚蠢的问题,并感谢任何帮助!!

1 个答案:

答案 0 :(得分:0)

您将所有电影抓取传递给细节模板,因此他们自然会全部展示。您应该按照模板中的反向关系来显示实际相关的关系,而不是这样做:

FilmStillsImage

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

并且根本不需要从视图中传递film_grabs。