Передать несколько объектов в шаблоны с визуализацией

Я начинающий на Джанго.

У меня есть проект со следующими моделями:

Мои статьи моделей:

class Post(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=160)
    content = models.TextField()
    image = models.ImageField(upload_to=upload_location)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    categorie = models.CharField(max_length=200)
    categorie = models.ForeignKey('categorie.Categorie')
    publier = models.BooleanField()

Мои модели категорий портфолио, которые связаны с моей моделью статьи:

class Categorieport(models.Model):
    title = models.CharField(max_length=200)
    article = models.OneToOneField('posts.Post')    

И напоследок мое портфолио моделей со всеми фотографиями:

class Portfolio(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to=upload_location)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    categorieportfolio = models.ForeignKey('Categorieport')

В одном представлении и одном шаблоне я хотел бы отобразить информацию, касающуюся статьи и портфолио, связанного со статьей.

Я написал следующее мнение:

def portfolio(request, article=None):
    portfolio = get_object_or_404(Categorieport, article=article)
    image_portfolio = portfolio.portfolio_set.all()
    return render(request, 'portfolio1.html', {'portfolio': portfolio, 'image_portfolio': image_portfolio})

И следующие шаблоны:

<div class="titre-display">
    <h2>{{ portfolio.article.timestamp|date:"d E Y" }} / {{ portfolio.article.categorie}} </h2>
    <h1>{{ portfolio.article.title}}</h1>
</div>  

<div class="content-display">
    <div class="content-display-main">
        <div class="content-display-main-portfolio">
            <div class="image-portfolio">
                <a class="example-image-link" href="{{ image_portfolio.image.url }}" data-lightbox="example-set" data-title="{{image_portfolio.title}}">
                </a>

Я могу получить доступ к информации из моей статьи, но не могу получить доступ к информации из своего портфолио. Я попробовал это с оболочкой, и это работает. Я не могу понять, почему это не работает в моем представлении и шаблоне.

Есть ли у вас какие-либо идеи?

заранее спасибо

Singertwist

3 ответа

Решение

Ваш image_portfolio - это querySet, это значит, что это какой-то список, вы должны использовать цикл для доступа к элементам и их доступа к свойствам:

<div class="content-display">
    <div class="content-display-main">
        <div class="content-display-main-portfolio">
            <div class="image-portfolio">
           {% for item_img in image_portfolio %}     
                <a class="example-image-link" href="{{ item_img.image.url }}" data-lightbox="example-set" data-title="{{item_img.title}}"></a>
            {% endfor %}

Попробуй это:

# views.py

def portfolio(request, article=None):
    # first get the Post instance with slug = article (I'm assuming article passed as url argument, is a slug)
    post = get_object_or_404(Post, slug=article)

    # get the Categoriepost object based on a specifi article
    categorie_port = get_object_or_404(Categorieport, article=post)

    # image_portfolio is a QuerySet (that is a list of Portfolio objects)
    image_portfolio = categorie_port.portfolio_set.all()

    return render(request, 'portfolio1.html', {'portfolio': categorie_port, 'image_portfolio': image_portfolio})

Оставьте свой HTML как есть.

Привет всем спасибо за ответ.

Итак, я использовал цикл for для решения моего случая, как упоминалось ранее.

Ниже мой код:

  <div class="titre-display">
        <h2>{{ portfolio.article.timestamp|date:"d E Y" }} / {{ portfolio.article.categorie}} </h2>
        <h1>{{ portfolio.article.title}}</h1>
    </div>  

    <div class="content-display">

        <div class="content-display-main">

        <div class="content-display-main-portfolio">


              {% for photo in image_portfolio %}  

              <div class="image-portfolio">

              <a class="example-image-link" href="{{ photo.image.url }}" data-lightbox="example-set" data-title="{{photo.title}}">

            {% thumbnail photo.image "300x300" crop="center" as im %}
                <img class="example-image" src="{{ im.url }}" alt=""/>
            {% endthumbnail %}    

              </a>
              <p>{{photo.title}}</p>
              </div>

            {% empty %}

                <p>Aucun portfolio.</p>

            {% endfor %}          

        </div>            

        </div>

И мои взгляды:

def portfolio(request, slug=None, article=None):
slug = get_object_or_404(Post, slug=slug)
portfolio = get_object_or_404(Categorieport, article=article)
image_portfolio = portfolio.portfolio_set.all()
return render(request, 'portfolio.html', {'portfolio': portfolio, 'image_portfolio': image_portfolio})

В очередной раз благодарим за помощь

Singertwist

Другие вопросы по тегам