मेरे पास exercise_tracker नाम का एक ऐप है और मैं अपने base.html को दो टेम्प्लेट के साथ विस्तारित करना चाहता हूं: exercise_list.html और footer.htmlexercise_list.html के लिए मैंने footer.html के लिए view सेट नहीं किया है। यह footer.html की सामग्री प्रस्तुत नहीं करता है। क्या आप मुझे संकेत दे सकते हैं कि मैं क्या गलत कर रहा हूँ?

View.py

from django.shortcuts import render
from django.utils import timezone
from .models import Exercise

def exercise_list(request):
    exercises = Exercise.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'exercise_tracker/exercise_list.html', {"exercises": exercises})

बेस.एचटीएमएल

<html>
    <body>
        {% block content %}
        {% endblock %}

        {% block footer %}
            <p>Footer placeholder</p>
        {% endblock %}
    </body>
</html>

व्यायाम_सूची.html

{% extends 'exercise_tracker/base.html' %}

{% block content %}
    <table>
    {% for exercise in exercises %}
        <tr>
            <td>{{ exercise.date_learned }}</td>
            <td>{{ exercise.time_studied }}</td>
            <td>{{ exercise.language_learned }}</td>
            <td>{{ exercise.description|linebreaksbr }}</td>
        </tr>
    {% endfor %}
    </table>
{% endblock %}

Footer.html

{% extends 'exercise_tracker/base.html' %}

{% block footer %}
    <p>Footer</p>
{% endblock %}
2
didierCH 22 पद 2018, 12:01

3 जवाब

सबसे बढ़िया उत्तर

extends टेम्प्लेट टैग का उपयोग करने से Django को पेरेंट टेम्प्लेट में ब्लॉक को केवल उपयोग किए गए चाइल्ड टेम्प्लेट में परिभाषित ब्लॉक सामग्री के साथ पॉप्युलेट करने के लिए कहता है!

जब आप अपने exercice_list.html में केवल content ब्लॉक को पॉप्युलेट करते हैं तो आपके कॉल करने पर base.html का केवल content ब्लॉक पॉप्युलेट होगा आपका exercice_list दृश्य। ऐसा इसलिए है क्योंकि django यह नहीं देखता है कि कौन से अन्य टेम्पलेट पैरेंट टेम्पलेट का विस्तार कर सकते हैं, इसलिए यह परवाह नहीं करता कि कहीं कोई footer.html है जो इसे विस्तारित भी करता है। यदि आप चाहते हैं कि footer.html से सामग्री शामिल हो जब आप exercice_list दृश्य को कॉल करते हैं तो आपको इसे या तो पहले से ही base.html में जोड़ना होगा या फिर exercice_list.html

पादलेख को एक अलग टेम्पलेट में रखना पूरी तरह से ठीक है, लेकिन आपको इसे exercice_list.html में एक ब्लॉक के रूप में भी जोड़ना होगा:

{% extends 'exercise_tracker/base.html' %}
{% block content %}
<table>
{% for exercise in exercises %}
    <tr>
        <td>{{ exercise.date_learned }}</td>
        <td>{{ exercise.time_studied }}</td>
        <td>{{ exercise.language_learned }}</td>
        <td>{{ exercise.description|linebreaksbr }}</td>
    </tr>
{% endfor %}
</table>
{% endblock %}

{% block footer %}
    {% include "footer.html" %}
{% endblock %}

और आपका footer.html ऐसा दिखाई दे सकता है:

<p>Footer</p>

यदि आप इसके बारे में कुछ और पढ़ना चाहते हैं, तो include और extend के बारे में एक SO प्रश्न एक अच्छा प्रारंभिक बिंदु है: django टेम्प्लेट: शामिल करें और विस्तारित करें या फिर टेम्पलेट विरासत के बारे में उत्कृष्ट django दस्तावेज़ .

उम्मीद है कि इससे कोडिंग में मदद मिली और खुशी हुई!

2
jojo 22 पद 2018, 18:00

मेरा सुझाव है कि आप अपनी exercise_list.html . संपादित करें

{% extends 'exercise_tracker/base.html' %}

{% block content %}
    <table>
    {% for exercise in exercises %}
        <tr>
            <td>{{ exercise.date_learned }}</td>
            <td>{{ exercise.time_studied }}</td>
            <td>{{ exercise.language_learned }}</td>
            <td>{{ exercise.description|linebreaksbr }}</td>
        </tr>
    {% endfor %}
    </table>
{% endblock %}
{% block footer %}
   <p>Footer placeholder</p>
{% endblock %}

base.html . में

<html>
    <body>
        {% block content %}
        {% endblock %}

        {% block footer %}
        {% endblock %}
    </body>
</html>

यह आपकी समस्या का समाधान कर सकता है।

2
shafik 22 पद 2018, 12:16

आपको पादलेख के लिए एक अलग टेम्पलेट की आवश्यकता नहीं है। यदि आप पूरी वेबसाइट के लिए एक ही पादलेख का उपयोग कर रहे हैं तो आप बस इसे base.html में कोड कर सकते हैं। यदि आप इसे केवल कुछ स्थानों पर ओवरराइड करना चाहते हैं, तो बस बेस टेम्प्लेट में पाद लेख के लिए एक ब्लॉक जोड़ें और जहां आप चाहते हैं, वहां इसे ओवरराइड करें।

यह आपको एक विचार देना चाहिए:

Base.html :

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title></title>
    // Site-Wide Links , CDN go here
    {% block head %} 
    {% endblock %
  </head>
  <body>
// Base code goes here
    {% block content %}
    {% endblock %}    
<footer>
// Base Footer goes here
    {% block footer %}
    {% endblock %}

</footer>

  </body>
</html>

some_template.html :

{% extends 'exercise_tracker/base.html' %} 
    {% block head %}
    //Your CSS , CDN here 
    {% endblock %}

    {% block content %}
 // Your HTML here
    {% endblock %}

    {% block footer %}
//Your Footer Here if you need to add something
    {% endblock %}
0
DarkSied 22 पद 2018, 17:21