2016-10-21 3 views
0

Ich habe zwei Modelle mit einem Fremdschlüssel, eine zu viele Beziehung, so dass ich ein Repeater-Modell (Bilder) im Admin bekommen kann. Der Bildwiederholer funktioniert einwandfrei, mein Problem ist, dass die Bilder für das Feld - video_stills, die auf einem der Filmpost/Objekte gespeichert sind, sich über alle Filmbeiträge wiederholen.Repeater-Objekte erscheinen in allen Detailansichten - django

Hier ist mein Code:

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',)} 

Ich bin sicher, es ist eine einfache Lösung, ich habe ein Gefühl wegen objects.all() in meinen Ansichten, bevölkert es zu jedem Element.

Entschuldigung, wenn es eine dumme Frage ist und danke für jede Hilfe !!

+0

Das ist nicht klar, fürchte ich. * Wo wiederholen sich die Filmbilder? –

+0

Sorry, wenn ich nicht klar war. Die Bilder für das dazugehörige Feld 'video_stills' erscheinen auf jedem Filmelement oder Post (Detailansicht), obwohl sie nicht auf jedem Objekt gespeichert wurden. Ich hoffe das ergibt Sinn! – darcemac

Antwort

0

Sie übergeben alle Filmgrabber an die Detailvorlage, also werden sie natürlich alle angezeigt. Statt das zu tun, sollten Sie nur die umgekehrte Beziehung in der Vorlage folgen diejenigen zu zeigen, dass tatsächlich verwandt sind:

FilmStillsImage

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

und es besteht keine Notwendigkeit film_grabs aus der Sicht überhaupt passieren.

+0

Vielen Dank Daniel, wirklich zu schätzen, Legende !! Nur eine andere Frage, ist mein Ansatz der beste Weg, um Bilder im Admin wiederholt zu laden? Prost nochmal! – darcemac

+0

Ich bin mir nicht sicher, was Sie mit "Upload wiederholen" meinen, aber dies ist der Standard für eine Eins-zu-viele-Beziehung. –

+0

Ich meinte mehrere Bilder hochladen über den Admin mit der 1: n-Beziehung. Ich bin neu in Django und komme für WP, sie haben das Advanced Custom Fields Plugin, um diese Funktionalität zu bieten ... – darcemac

Verwandte Themen