【问题标题】:Pass multiple objects to templates with render使用渲染将多个对象传递给模板
【发布时间】:2017-08-30 00:55:33
【问题描述】:

我是 Django 的初学者。

我有一个包含以下模型的项目:

我的文章模型:

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>

我可以访问我的文章中的信息,但我无法访问我的投资组合中的信息。我用外壳试了一下,它工作正常。我不知道为什么它在我的视图和模板中不起作用。

你有什么想法吗?

提前谢谢你

曲风

【问题讨论】:

  • 请正确格式化您的代码。读起来不太好。此外,请查看基于类的视图,尤其是 get_context_data 方法。

标签: django multiple-variable-return


【解决方案1】:

您的 image_portfolio 是一个查询集,这意味着它是某种列表,您必须使用循环来访问项目并且它们访问属性:

<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 %}

【讨论】:

    【解决方案2】:

    试试这个:

    # 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 不变。

    【讨论】:

      【解决方案3】:

      大家好,谢谢大家的回答。

      所以,如前所述,我使用 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})
      

      再次感谢您的帮助

      曲风

      【讨论】:

        猜你喜欢
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-13
        • 2014-11-29
        • 2018-07-02
        相关资源
        最近更新 更多