2017-04-04 1 views
1

Je suis débutant sur Django.Transmettre plusieurs objets aux modèles avec rendu

J'ai un projet avec les modèles suivants:

Mes articles modèles:

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() 

Mon portefeuille catégories de modèles qui est lié à mon article Modèle:

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

Et enfin, mes modèles de portefeuille avec toutes les photos:

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

Dans une vue et un modèle, je voudrais afficher des informations concernant l'article et le portefeuille lié à l'article.

j'ai écrit la vue suivante:

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

Et les modèles suivants:

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

je peux accéder à l'information de mon article, mais je ne peux pas accéder aux informations de mon portefeuille. Je l'ai essayé avec le shell, et ça marche. Je n'arrive pas à comprendre pourquoi cela ne marche pas dans mon point de vue et mon modèle.

Avez-vous une idée?

Nous vous remercions à l'avance

Singertwist

+0

S'il vous plaît formater votre code correctement. Ce n'est pas agréable à lire. En outre, examinez les vues basées sur les classes en général et la méthode 'get_context_data' en particulier. – creimers

Répondre

0

Votre image_portfolio est un queryset, c'est des moyens est une sorte de liste, vous devez utiliser une boucle pour accéder aux éléments et de les accéder aux propriétés:

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

Essayez ceci:

# 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}) 

Laissez votre HTML est.

0

Salut vous remercie tous pour votre réponse. Donc, j'ai utilisé une boucle for pour résoudre mon cas comme mentionné précédemment.

Ci-dessous, mon code:

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

Et mon point de vue:

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

Merci encore pour votre aide

Singertwist