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)