首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一个模板包含在另一个模板中?

如何将一个模板包含在另一个模板中?
EN

Stack Overflow用户
提问于 2020-07-24 21:01:22
回答 1查看 66关注 0票数 0

我是编程新手,我正在寻找是否有一种方法,我可以包括一个模板内的其他模板。我正在做一个项目,我想在同一页上显示某个主题的内容和抽认卡,以测试我对这个主题的知识,当我试图在同一页上显示我的卡时卡住了(我只能使用另一个网址)。这是我到目前为止所知道的:

models.py:

代码语言:javascript
复制
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()

views.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
{% 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:

代码语言:javascript
复制
{% 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:名称'deck_id’未定义。我该如何解决这个问题呢?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-07-25 00:52:58

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

代码语言:javascript
复制
from name_of_your_app import views

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

(?P\d+)是重要的部分,因为它指示您将收到一个可以使用名称"deck_id“调用的数值数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63074098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档