django 自定义博客 post url
django custom blog post urls
我正在通过构建一个简单的博客应用程序来学习 Django。虽然它几乎完成了,但我目前有个人 post 具有格式 https://my_site_dot_com/blog/entry/38/
的 url,其中数字 38 对应于所述 post 的主键。
我想要的是格式 https://my_site_dot_com/blog/entry/this_is_custom_title/
,其中“this_is_custom_title”对应于 post 的标题。我不知道如何做到这一点。谁能提供任何帮助?
我的模型看起来像:
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
我想要 entry_title 自定义 url 而不是主键。
我的 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 传递给 post 看起来像这样:
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。所以请给一个通俗易懂的解释。
提前致谢
如果您使用的是基于 Class 的视图,则应使用 slug。
首先向您的 Entry 模型添加一个新字段 entry_slug 并覆盖保存方法以自动生成 entry_slug 字段:
class Entry(models.Model):
entry_title = models.CharField(max_length=50)
entry_slug = models.CharField(max_length=50)
...
def save(self, *args, **kwargs):
self.entry_slug = slugify(self.entry_title )
super(Entry, self).save(*args, **kwargs)
您可以将 pk 替换为 entry_slug:
path('entry/<slug:entry_slug>/', EntryView.as_view(), name="entry-detail")
目前您正在通过 url 传递一个整数。您需要做的就是稍微修改它以通过 url 传递一个字符串。 Here 是一个类似的问题,讨论了如何实现这一点。
至于您需要在代码中进行的更改,urls.py
需要更新
path('entry/<str:title>/', EntryView.as_view(), name="entry-detail")
您还没有提供您的博客 post 视图,但它看起来像这样:
def post(request, title):
template = "template.html"
post = Posts.objects.filter(entry_title==title)
return render(request, template, {'post':post})
您可以向 Entry 模型和 get_absolute_url 方法添加一个 slug 字段。不要忘记从 Django 的 url 模块导入 reverse 函数。
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 模式添加到 url模式 列表。别忘了加载相应的视图,我猜这里可能是EntryView.
from django.urls import path
from .views import EntryView
urlpatterns = [
...
path('<slug:slug>', EntryView.as_view(), name='entry_detail'), # new
...
]
然后 slug 应该替换 url 中的主键模式。
更进一步,您可以在您的模型中使用一种方法,例如对您的标题进行 slug 化。 (在模型中定义方法,然后从模型的 save 方法中调用它,方法是覆盖保存方法)
https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.text.slugify
我正在通过构建一个简单的博客应用程序来学习 Django。虽然它几乎完成了,但我目前有个人 post 具有格式 https://my_site_dot_com/blog/entry/38/
的 url,其中数字 38 对应于所述 post 的主键。
我想要的是格式 https://my_site_dot_com/blog/entry/this_is_custom_title/
,其中“this_is_custom_title”对应于 post 的标题。我不知道如何做到这一点。谁能提供任何帮助?
我的模型看起来像:
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
我想要 entry_title 自定义 url 而不是主键。
我的 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 传递给 post 看起来像这样:
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。所以请给一个通俗易懂的解释。 提前致谢
如果您使用的是基于 Class 的视图,则应使用 slug。 首先向您的 Entry 模型添加一个新字段 entry_slug 并覆盖保存方法以自动生成 entry_slug 字段:
class Entry(models.Model):
entry_title = models.CharField(max_length=50)
entry_slug = models.CharField(max_length=50)
...
def save(self, *args, **kwargs):
self.entry_slug = slugify(self.entry_title )
super(Entry, self).save(*args, **kwargs)
您可以将 pk 替换为 entry_slug:
path('entry/<slug:entry_slug>/', EntryView.as_view(), name="entry-detail")
目前您正在通过 url 传递一个整数。您需要做的就是稍微修改它以通过 url 传递一个字符串。 Here 是一个类似的问题,讨论了如何实现这一点。
至于您需要在代码中进行的更改,urls.py
需要更新
path('entry/<str:title>/', EntryView.as_view(), name="entry-detail")
您还没有提供您的博客 post 视图,但它看起来像这样:
def post(request, title):
template = "template.html"
post = Posts.objects.filter(entry_title==title)
return render(request, template, {'post':post})
您可以向 Entry 模型和 get_absolute_url 方法添加一个 slug 字段。不要忘记从 Django 的 url 模块导入 reverse 函数。
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 模式添加到 url模式 列表。别忘了加载相应的视图,我猜这里可能是EntryView.
from django.urls import path
from .views import EntryView
urlpatterns = [
...
path('<slug:slug>', EntryView.as_view(), name='entry_detail'), # new
...
]
然后 slug 应该替换 url 中的主键模式。
更进一步,您可以在您的模型中使用一种方法,例如对您的标题进行 slug 化。 (在模型中定义方法,然后从模型的 save 方法中调用它,方法是覆盖保存方法)
https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.text.slugify