Django 中特定主键的动态 url
dynamic url for specific primary key in Django
我的模型有一个字段调用 topic
,我想创建一个可以显示特定内容的页面,并且 url 可以是同一 html 模板呈现的不同主题的动态路径.我应该怎么做?
models.py:
TOPIC = (
(0,"Finance"),
(1,"Toys"),
(2,"Foods"),
(3,"Travel"),
)
class Post(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(unique=True, max_length=200)
author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='blog_posts')
updated_on = models.DateTimeField(auto_now= True)
created_on = models.DateTimeField(auto_now_add=True)
body = RichTextField(null=True)
status = models.IntegerField(choices=STATUS, default=0)
topic = models.IntegerField(choices=TOPIC, default=0)
cover_img = models.ImageField(upload_to='post_cover', null=True, default='post_cover/coming_soon.jpg')
def __str__(self):
return self.name
def get_img(self):
return f"{'/media/post_cover/'+self.cover_img}"
html
<div class="col-md-6 mt-3 ">
<a href="{% url 'topic_list' %}">
<img src="../media/topic/travel3.jpg" alt=''>
</a>
</div>
views.py
def topic_list(request):
posts = Post.objects.filter(topic=0)
context = {'posts': posts, 'autor_list':autor_list}
return render(request, 'topic_list.html', context)
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('topic/', views.topic_list, name='topic_list'),
path('<slug:slug>/', views.post_detail, name='post_detail'),]
要在模板中生成 动态 url,请使用带参数的 url-reversion 函数
{% for post in post_list %}
<a href="{% url 'post_detail' post.slug %}">{{ post.name}}</a>
{% endfor %}
这将 反转 post_detail
url 模式从你的 urls.py 与 post.slug
值传递给 '<slug:slug>/'
如果您需要按主题列出帖子,请修正您的 url 模式和如下视图:
urlpatterns = [
...
path('topic/<int:pk>/', views.topic_post_list, name='topic-posts-list'),
]
def topic_post_list(request, pk):
posts = Post.objects.filter(topic_id=pk, )
context = {'posts': posts, }
return render(request, 'post_list.html', context)
我的模型有一个字段调用 topic
,我想创建一个可以显示特定内容的页面,并且 url 可以是同一 html 模板呈现的不同主题的动态路径.我应该怎么做?
models.py:
TOPIC = (
(0,"Finance"),
(1,"Toys"),
(2,"Foods"),
(3,"Travel"),
)
class Post(models.Model):
name = models.CharField(max_length=200)
slug = models.SlugField(unique=True, max_length=200)
author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='blog_posts')
updated_on = models.DateTimeField(auto_now= True)
created_on = models.DateTimeField(auto_now_add=True)
body = RichTextField(null=True)
status = models.IntegerField(choices=STATUS, default=0)
topic = models.IntegerField(choices=TOPIC, default=0)
cover_img = models.ImageField(upload_to='post_cover', null=True, default='post_cover/coming_soon.jpg')
def __str__(self):
return self.name
def get_img(self):
return f"{'/media/post_cover/'+self.cover_img}"
html
<div class="col-md-6 mt-3 ">
<a href="{% url 'topic_list' %}">
<img src="../media/topic/travel3.jpg" alt=''>
</a>
</div>
views.py
def topic_list(request):
posts = Post.objects.filter(topic=0)
context = {'posts': posts, 'autor_list':autor_list}
return render(request, 'topic_list.html', context)
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('topic/', views.topic_list, name='topic_list'),
path('<slug:slug>/', views.post_detail, name='post_detail'),]
要在模板中生成 动态 url,请使用带参数的 url-reversion 函数
{% for post in post_list %}
<a href="{% url 'post_detail' post.slug %}">{{ post.name}}</a>
{% endfor %}
这将 反转 post_detail
url 模式从你的 urls.py 与 post.slug
值传递给 '<slug:slug>/'
如果您需要按主题列出帖子,请修正您的 url 模式和如下视图:
urlpatterns = [
...
path('topic/<int:pk>/', views.topic_post_list, name='topic-posts-list'),
]
def topic_post_list(request, pk):
posts = Post.objects.filter(topic_id=pk, )
context = {'posts': posts, }
return render(request, 'post_list.html', context)