害怕在这里问这个问题,只是用Stack Overflow声明并相信我,我曾尝试搜索此问题,但主要是我看到了正则表达式模式。
如果有人能帮助我解决这几个问题,请
如何用帖子名称自动填写我的博客模型条目字段,而无需自己填写。
如何使用Django 2.x中的slug WITHOUT regex链接到单个帖子页面
谢谢。
答案 0 :(得分:5)
因此您尚未发布代码,但假设您的模型如下所示:
class Post(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
content = models.TextField()
并且您想从标题中预填充slug
,根据您要在哪里选择,您有一些选择:
Post
仅由员工用户创建:将其预先填充到管理员中Post
将在管理员外部创建:覆盖.save()
方法在管理员中获取此权限最简单的方法是通过prepopulated_fields
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('title',)}
在创建帖子时,Django会在您键入标题时自动<<> 更新子弹字段。非常好的UX,但仅限于管理员...
在前面的示例中,如果要从控制台或其他页面创建帖子,则可能会以空子结尾。在这种情况下,您可以通过覆盖模型的.save()
方法并在其中调用slugify
来快速确保已预填充了塞子:
class Post(models.Model):
title = models.CharField(max_length=100)
slug = models.SlugField(unique=True)
content = models.TextField()
def save(self, *args, **kwargs):
self.slug = self.slug or slugify(self.title)
super().save(*args, **kwargs)
免责声明:如果您需要此部分的更多详细信息,建议使用part 3 of the official tutorial。
提供您一个URL路径:
# urls.py
from django.urls import path
from your_blog import views
urlpatterns = [
path('posts/<slug:the_slug>/', views.post_detail_view, name='show_post'),
]
然后,在您的视图模块中,您将拥有一个视图:
# your_blog/views.py
from django.views.generic.detail import DetailView
class PostDetailView(DetailView):
model = Post
# This file should exist somewhere to render your page
template_name = 'your_blog/show_post.html'
# Should match the value after ':' from url <slug:the_slug>
slug_url_kwarg = 'the_slug'
# Should match the name of the slug field on the model
slug_field = 'slug' # DetailView's default value: optional
post_detail_view = PostDetailView.as_view()
您可以通过在Python中调用来链接到Post
:
reverse('show_post', args=[the_post.slug])
或在Django模板中:
<a href="{% url 'show_post', the_post.slug %}">{{ the_post.title }}</a>
然后您可以添加索引页面,生成一个链接到您所有帖子的列表:
# your_blog/views.py
from django.views.generic import ListView
class PostListView(ListView):
model = Post
# This file should exist somewhere to render your page
template_name = 'your_blog/list_post.html'
在视图模板中:
<!-- your_blog/list_post.html -->
<ul>
{% for the_post in object_list %}
<li>
<a href="{% url 'show_post' the_post.slug %}">{{ the_post.title }}</a>
</li>
{% endfor %}
</ul>
希望有帮助:)