python - django 自定义博客文章网址
问题描述
我正在通过构建一个简单的博客应用程序来学习 django。虽然它几乎完成了,但我目前有一个单独的帖子,其 url 的格式https://my_site_dot_com/blog/entry/38/
是数字 38 对应于所述帖子的主键。我想要的是它具有https://my_site_dot_com/blog/entry/this_is_custom_title/
“this_is_custom_title”对应于帖子标题的格式。我不知道如何做到这一点。任何人都可以提供任何帮助吗?我的模型看起来像:
class Entry(models.Model):
entry_title = models.CharField(max_length=50)
entry_text = models.TextField()
image = models.FileField(upload_to="media", blank=True)
entry_date = models.DateTimeField(auto_now_add=True)
entry_author = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
verbose_name_plural = "blog"
def __str__(self):
return self.entry_title
我想要自定义 url 而不是主键的 entry_title。
我的urls.py
样子是这样的:
urlpatterns = [
path('', HomeView.as_view(), name="blog-home"),
path('entry/<int:pk>/', EntryView.as_view(), name="entry-detail"),
path('create_entry/', CreateEntryView.as_view(success_url='/'), name='create_entry'),
]
编辑:处理帖子的班级如下所示:
class EntryView(DetailView):
model = Entry
template_name = 'blog/entry_detail.html'
data_set = random_info()
stuff_for_post = {
"info": data_set
}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['rand_im'] = random_image()
context['tags'] = ['tag1','tag2','tag3']
return context
我是 django 的绝对菜鸟,来自 android/java。所以请给一个通俗易懂的解释。提前致谢
解决方案
您可以将 slug 字段添加到您的Entry模型和get_absolute_url方法。不要忘记从 Django 的 url 模块中导入反向函数。
from django.urls import reverse
class Entry(models.Model):
entry_title = models.CharField(max_length=50)
entry_text = models.TextField()
image = models.FileField(upload_to="media", blank=True)
entry_date = models.DateTimeField(auto_now_add=True)
entry_author = models.ForeignKey(User, on_delete=models.CASCADE)
slug = models.SlugField()
def get_absolute_url(self):
return reverse('entry_detail', kwargs={'slug': self.slug})
class Meta:
verbose_name_plural = "blog"
def __str__(self):
return self.entry_title
然后,在应用程序的urls.py模块中,将以下 url 模式添加到urlpatterns列表中。别忘了加载对应的视图,我猜这种情况下可能是EntryView。
from django.urls import path
from .views import EntryView
urlpatterns = [
...
path('<slug:slug>', EntryView.as_view(), name='entry_detail'), # new
...
]
然后 slug 应该替换 url 中的主键模式。
更进一步,您可以在模型中使用一种方法来使您的标题变得迟钝。(在模型中定义方法,然后通过覆盖保存方法从模型的保存方法中调用它)
https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.text.slugify
推荐阅读
- prisma-graphql - 如何删除prisma2中的关系项
- python - 在 pandas 中处理带有条件的记录
- c# - 使用 Roslyn 确定类是否为记录
- macos - 我还需要 Mac 来为 iOS 开发 react-native 应用程序吗?
- c - SDL2 无法在虚拟机中获取显示模式(没有可用的视频设备)
- hibernate - 在休眠中使用 SequenceGenerator 时强制 id 值
- php - 提交后如何留在页脚部分?#php
- c# - 无法将带有 [] 的索引应用于 JObject 类型的表达式
- laravel - PHP致命错误:允许的内存大小为1610612736字节已用尽
- azure - 在 Azure 解决方案中提供 App 服务安全性