django - 如何在另一个模板中包含一个模板?
问题描述
我是编程新手,我正在寻找是否有一种方法可以在其他模板中包含一个模板。我正在做一个项目,我想在同一页面上显示某个主题的内容和抽认卡以测试我对该主题的了解,并且在尝试在同一页面上显示我的卡片时卡住了(我只能让它工作使用另一个网址)。这是我到目前为止所拥有的:
模型.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。我怎样才能解决这个问题?
谢谢你。
解决方案
您是否正确构建了网址?为了能够像您在视图中那样传递 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”调用的数字数据。
推荐阅读
- java - 使用 JPA 计算特定列
- javascript - 如何使用 puppeteer 生成可编辑的 PDF
- python - 为什么使用 docker-compose 在 Docker 容器中 Python 进程的父 pid 有时为 0?
- macos - Minikube 无法在带有 VPN 的 Mac 上启动
- javascript - 将包含填充数据的完整 HTML Web 表单从浏览器获取到电子邮件或 PDF
- java - 一个函数,它获取一个链表和一个数字并更改列表,使其由总和为给定数字的对组成
- c# - 寻找有关我的单元测试用例逻辑 c# 控制台应用程序的建议
- javascript - 以角度创建按钮时出错
- react-native - React Native 正则表达式导致 iOS 11.2 崩溃
- c - 在 C 中传递可变参数