Je veux transmettre des données à partir d'une page html que j'utilise for loop dans cette page et afficher toutes les données dans d'autres pages html alors j'ai essayé ceci mais cela ne passe pas pour les données de boucle de mon modèle pourquoi

Side_bar_good_posts.html:

      {% for post in best_posts %}
  <div class="card rounded mx-auto d-block" style="width: 18rem;margin-bottom:50px;border-color:#7952b3">

  <div class="card-body" id="mobile_design_card">
    <a href="{{post.url}}"><p class="card-text" id="mobile_design_card_name">{{ post.name }}</p></a>
  </div>
  <a href="{{post.url}}"><img src="{{ post.get_image }}" class="card-img-top" alt="..." height="290px" width="300px"></a>

  </div>
&nbsp; &nbsp;
    {% endfor %}

Views.py:

from .models import BestArticals

def Best_Articals(request):
    best_posts = BestArticals.objects.all()
    context = {'best_posts' : best_posts}
    return render(request,'android/side_bar_good_posts.html',context=context)

Dans d'autres pages html:

{% include "android/side_bar_good_posts.html" with best_posts=best_posts %}

Il ne montre que des balises html, mais les données de la boucle for n'apparaissent pas pourquoi

0
Kok Hyvv 2 nov. 2020 à 22:03

2 réponses

Meilleure réponse

Enfin j'ai résolu le problème merci pour tout le monde aidez-moi

  • dans views.py, vous devez ajouter cette ligne dans chaque def ou class si vous souhaitez utiliser {%include with for loop and all data %} dans toutes les pages html

Ajoutez cette ligne dans tout def or class in views.py:

best_posts = BestArticals.objects.all() # this is my model name called BestArticals replace name to yours 

Puis suivez les étapes ci-dessous

Dans mon cas c'est mon code complet

Views.py:

def android_posts(request,slug):
    android_posts = get_object_or_404(Android, slug=slug)
    best_posts = BestArticals.objects.all() # this line you must add it to all def in views
    context = {'android_posts':android_posts,'best_posts' : best_posts} # and here put best_posts or yours 
    return render(request,'android/android_posts_page.html', { 'android_posts': android_posts,'best_posts' : best_posts }) # and here put best_posts or yours 

def Best_Articals(request):
    best_posts = BestArticals.objects.all()
    context = {'best_posts' : best_posts}
    return render(request,'android/side_bar_good_posts.html', context)

Side_bar_good_posts.html:

make your own design

      {% for post in best_posts %}
  <div class="card rounded mx-auto d-block" style="width: 18rem;margin-bottom:50px;border-color:#7952b3">

  <div class="card-body" id="mobile_design_card">
    <a href="{{post.url}}"><p class="card-text" id="mobile_design_card_name">{{ post.name }}</p></a>
  </div>
  <a href="{{post.url}}"><img src="{{ post.get_image }}" class="card-img-top" alt="..." height="290px" width="300px"></a>

  </div>
&nbsp; &nbsp;
    {% endfor %}

Dans d'autres pages html que vous souhaitez utiliser incluent:

{% include 'android/side_bar_good_posts.html' with best_posts=best_posts %}

Et tout fonctionnera bien!

0
Kok Hyvv 2 nov. 2020 à 21:44

Si je comprends votre inquiétude, vous souhaitez inclure un HTML partiel android/side_bar_good_posts.html dans de nombreuses pages.

Cela a été dit, l'astuce consiste à passer best_posts avec d'autres variables / ensembles (par exemple posts pour l'application de blog) dans le contexte et une fois disponible dans le contexte template, vous le transmettez ({ {X3}}) à nouveau sur le include en utilisant with.

Ci-dessous comment faire cela correctement.

Disons que vous avez des applications blog et home, la structure du projet devrait être comme

.yourproject

  .. home
     .. templates
        .. home
           .. index.html
     .. views.py


  .. blog
     .. templates
        .. blog
           .. post_list.html
           .. post_detail.html
        .. includes  # the folder that will hold all 'blog' app related html partials
           .. side_bar_good_posts.html  # as good naming prefer the rails way: 
                                        # prefixing partials with '-'
                                        # e.g: _good_posts.html
     .. views.py


   .. templates  # Global project templates
      .. base.html

Dans blog/views.py

from .models import Artical, BestArticals  # import 'Artical' Model

def post_list(request):

    posts = Artical.objects.all()  # fetch all posts, you may add pagination ..

    best_posts = BestArticals.objects.all()

    context = {
        'posts' : posts,
        'best_posts' : best_posts
    }
    return render(request,'blog/post_list.html', context)

Dans blog/templates/blog/post_list.html:

{% extends 'base.html' %}
{% load static %}

..

<aside class="..">
{% include 'includes/_good_posts.html' with best_posts=best_posts %}
</aside>
..

Dans blog/templates/includes/_good_posts.html:

Votre code tel quel, il suffit de renommer post en best_post pour être cohérent et éviter tout conflit avec d'autres variables qui peuvent avoir le même nom

{% for best_post in best_posts %}
  <div class="card rounded mx-auto d-block" style="width: 18rem;margin-bottom:50px;border-color:#7952b3">

  <div class="card-body" id="mobile_design_card">
    <a href="{{best_post.url}}"><p class="card-text" id="mobile_design_card_name">{{ best_post.name }}</p></a>
  </div>
  <a href="{{best_post.url}}"><img src="{{ best_post.get_image }}" class="card-img-top" alt="..." height="290px" width="300px"></a>

  </div>
&nbsp; &nbsp;
{% endfor %}

Et ci-dessous comment inclure le même html partiel dans l'index d'accueil, même logique:

Dans home/views.py

from blog.models import BestArticals  # import the model from 'blog' app

def index(request):

    # fetch best posts ..
    best_posts = BestArticals.objects.all()

    [..]

    context = {
        ..,
        'best_posts' : best_posts
    }
    return render(request,'home/index.html', context)

Dans home/templates/home/index.html:

{% extends 'base.html' %}
{% load static %}

..

<aside class="..">
{% include 'includes/_good_posts.html' with best_posts=best_posts %}
</aside>
..

Remarques:

  • context=context: vous passez la fonction context à render() dans le mauvais sens, vous n'avez pas besoin de l'affecter à la variable

  • Je vous suggère de revoir votre logique avec les meilleurs articles, je pense que vous n'avez pas besoin d'un module autonome BestArticals, vous pouvez utiliser l'indicateur featured ou en fonction du nombre de vues ou de likes ...

  • comme bonnes pratiques, le nom des modèles doit être en un seul

1
cizario 3 nov. 2020 à 07:54