我有一个模型Post
。每个帖子都扩展post_detail.html
并有自己的网址:
urlpatterns = [
path('news/<int:pk>/', views.PostDetailView.as_view(), name='news_page'),
...
]
该模型由标题,描述,图像等组成。在main.html
上,显示最后一个帖子,第二个最后一个帖子和最后一个第三个帖子的标题和图像。我的views.py
看起来像
class PostListView(ListView):
model = Post
template_name = 'html/main.html'
def get_context_data(self, **kwargs):
posts = Post.objects.all().order_by('-id')
kwargs['last_post'] = posts[0]
kwargs['second_last_post'] = posts[1]
kwargs['third_last_post'] = posts[2]
return super().get_context_data(**kwargs)
在这里,我的模板中有最后一个帖子的标题和倒数第二个帖子:
<h5 href="#">{{ last_post.title }}</h5>
<h5 href="#">{{ second_last_post.title }}</h5>
现在,我想将这些标题连接到自己的网址。我的意思是,当我单击main.html
中最后一篇文章的标题时,我想打开该文章的单独网址。我该怎么办?
答案 0 :(得分:5)
第一步,您可以使用pk来构建URL:
url
接下来,您可以使用<h5 href="{% url 'news_page' last_post.pk %}">{{ last_post.title }}</h5>
标签
from django.urls import reverse
class Post(models.Model):
...
def get_absolute_url(self):
return reverse('news_page', args=[self.pk])
最后,如果您定义了get_absolute_url
方法,
<h5 href="{{ last_post.get_absolute_url }}">{{ last_post.title }}</h5>
然后您可以在模板中使用它:
app_name='posts'
最后是关于名称空间的注释:您尚未显示完整的URL配置,但是如果您使用的是名称空间,例如{% url posts:news_page last_post.pk %}
,那么当您反转网址时,您将需要包含名称空间,例如{{1}中的reverse('posts:news_page', args=[self.pk])
。