首页 > 解决方案 > 如何在另一个模板中包含一个模板?

问题描述

我是编程新手,我正在寻找是否有一种方法可以在其他模板中包含一个模板。我正在做一个项目,我想在同一页面上显示某个主题的内容和抽认卡以测试我对该主题的了解,并且在尝试在同一页面上显示我的卡片时卡住了(我只能让它工作使用另一个网址)。这是我到目前为止所拥有的:

模型.py:

class Topic(models.Model):
    author = models.ForeignKey(
        User, related_name="topic", on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=100)
    body = RichTextUploadingField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(max_length=120)

    class Meta:
        ordering = ["title"]

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('topic:topic-detail', kwargs={
                       "topic_slug": self.slug,})

class Deck(models.Model):
    deckTopic = models.ForeignKey(
        Topic, null=True, blank=True, on_delete=models.CASCADE)
    description = models.CharField(max_length=510, null=False, blank=True)
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.description

    def get_number_of_cards(self):
        '''
        Returns the number of cards in the decks related card_set
        '''
        return self.card_set.count()
    get_number_of_cards.short_description = 'Card Count'


class Card(models.Model):
    parentDeck = models.ForeignKey(Deck, on_delete=models.CASCADE)
    front = models.TextField()
    back = models.TextField()

    def __str__(self):
        return self.front

    def has_prev_card(self):
        '''
        Returns true if card is not thee first card in the deck.
        '''
        first_card_in_deck = self.parentDeck.card_set.first()
        if self == first_card_in_deck:
            return False
        return True

    def get_prev_card(self):
        '''
        Return previous card in deck
        '''
        return self.parentDeck.card_set.filter(id__lt=self.id).last()

    def has_next_card(self):
        '''
        Returns true if card is not the last card in the deck.
        '''
        last_card_in_deck = self.parentDeck.card_set.last()
        if self == last_card_in_deck:
            return False
        return True

    def get_next_card(self):
        '''
        Return next card in deck
        '''
        return self.parentDeck.card_set.filter(id__gt=self.id).first()


视图.py:

class TopicDetailView(DetailView):
    model = Topic

def viewDeck(request, deck_id):
    '''
    Gets the deck from the database.
    Return first card in deck unless card_id is specified in url.
    '''

    deck_obj = get_object_or_404(Deck, id=deck_id)
    card_list = deck_obj.card_set.all()
    card_obj = card_list.first()
    if request.method == 'GET' and 'card' in request.GET:
        card_obj = get_object_or_404(Card, id=request.GET['card'])

    context = {
        'deck_obj': deck_obj,
        'card_obj': card_obj,
    }
    return render(request, 'topic/viewDeck.html', context)

topic_detail.html:

{% extends 'base.html' %}
{% block content %}
<div class="topic-title">
        <h5 class="mb-0">
        {{object.title}}
        </h5>
</div>

<div class="topic-body">
        <p class="mb-0">
        {{object.body}}
        </p>
</div>

<!--Here is where I want to include the flashcard--!>
 <div class="topic-deck">                    
       {% for deck in object.deck_set.all %}
       {{deck.description}}
       <a href="{% url 'topic:viewDeck' deck.id %}">Flashcard</a>
       {% endfor %}
</div>
{% endblock %}

viewDeck.html:

{% extends 'base.html' %}

{% block content %}
<div class="deck-container">
    <div class="deck-header">
        <div class="deck-header-title">
            <h1>{{deck_obj}}</h1>
        </div>

        <div class="deck-header-actions">
            <p>Return to Topic</p>
        </div>
    </div>

    <hr>

    {% if card_obj %}
    <div class="notecard">
        <div class="notecard-nav text-center">
            {% if card_obj.has_prev_card %}
            <a href="{% url 'topic:viewDeck' deck_obj.id %}?card= 
            {{card_obj.get_prev_card.id}}">Prev</a>
            {% endif %}
            {% if card_obj.has_next_card %}
            <a href="{% url 'topic:viewDeck' deck_obj.id %}?card= 
            {{card_obj.get_next_card.id}}">Next</a>
            {% endif %}
        </div>
        <div class="notecard-front">
            <p class="text-center">Front</p>
            <p>{{card_obj.front}}</p>
        </div>
        <div class="notecard-back">
            <p class="text-center">Back</p>
            <p>{{card_obj.back}}</p>
        </div>
    </div>


    {% else %}

    <p>No card found.</p>

    {% endif %}

</div>
{% endblock %}

有没有办法在 topic_detail.html 中查看 deckView?对不起,如果我没有说清楚。

更新:我尝试插入 {% include 'viewDeck.html' %} 作为将上下文 deck_obj、card_list 和 card_obj 传递给 topic_detail.html,但它给了我这个错误:NameError: name 'deck_id' is not defined。我怎样才能解决这个问题?

谢谢你。

标签: djangotemplatesinclude

解决方案


您是否正确构建了网址?为了能够像您在视图中那样传递 deck_id,您必须通过在 urls.py 中编写类似这样的内容来告诉您的 url 您想要传递一些数据:

from name_of_your_app import views

url(r'deck/(?P<deck_id>\d+)/$', views.viewDeck , name='name_of_you_url'),

(?P<deck_id>\d+) 是重要的部分,因为它表示您将收到一个可以用名称“deck_id”调用的数字数据。


推荐阅读