Python django自定义博客文章URL

Python django自定义博客文章URL,python,django,django-urls,url-pattern,Python,Django,Django Urls,Url Pattern,我通过构建一个简单的博客应用程序来学习django。虽然一切都已完成,但我目前有一些帖子的url格式为https://my_site_dot_com/blog/entry/38/其中数字38对应于所述post的主键。 我想要的是它的格式https://my_site_dot_com/blog/entry/this_is_custom_title/其中“此标题为自定义标题”与文章标题相对应。我不知道如何做到这一点。有人能提供帮助吗? 我的模型看起来像: class Entry(models.Mod

我通过构建一个简单的博客应用程序来学习django。虽然一切都已完成,但我目前有一些帖子的url格式为
https://my_site_dot_com/blog/entry/38/
其中数字38对应于所述post的主键。 我想要的是它的格式
https://my_site_dot_com/blog/entry/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的条目标题,而不是主键

我的
url.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
def post(request, title):
    template = "template.html"
    post = Posts.objects.filter(entry_title==title)
    return render(request, template, {'post':post})

我绝对是django的noob,来自android/java。所以请给出一个简单易懂的解释。
提前感谢

如果您使用的是基于类的视图,则应使用slug。 首先将一个新字段entry\u slug添加到您的条目模型中,并覆盖save方法,以便自动生成entry\u 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替换为条目_slug来实现:

path('entry/<slug:entry_slug>/', EntryView.as_view(), name="entry-detail")
path('entry/',EntryView.as_view(),name=“entry detail”)

当前,您正在通过url传递一个整数。您所需要做的只是稍微修改一下,以便在url中传递一个字符串。是一个类似的问题,讨论如何实现这一点

至于您需要在代码中进行的更改,
url.py
需要更新

path('entry/<str:title>/', EntryView.as_view(), name="entry-detail")

您可以将slug字段添加到条目模型和获取绝对url方法。不要忘记从Django的url模块导入reverse函数

从django.url反向导入
类条目(models.Model):
条目标题=models.CharField(最大长度=50)
entry_text=models.TextField()
image=models.FileField(上传到=“媒体”,blank=True)
entry\u date=models.DateTimeField(auto\u now\u add=True)
条目\u author=models.ForeignKey(用户,在\u delete=models.CASCADE上)
slug=models.SlugField()
def get_绝对_url(自身):
返回反向('entry_detail',kwargs={'slug':self.slug})
类元:
详细的\u名称\u复数=“博客”
定义(自我):
返回self.entry\u标题
然后,在应用程序的urls.py模块中,将以下url模式添加到urlpatterns列表中。别忘了加载相应的视图,我想在这种情况下可能是EntryView

从django.url导入路径
from.views导入入口视图
URL模式=[
...
路径(“”,EntryView.as_view(),name='entry_detail'),#新建
...
]
然后,slug应该替换url中的主键模式

更进一步,您可以在模型中使用一种方法,例如,对标题进行slagify。(在模型中定义方法,然后通过覆盖save方法从模型的save方法调用它)


当我这样做时,我得到了一个错误:必须使用URLconf中的对象pk或slug调用Generic detail view EntryView。我使用的是基于类的方法。我已经编辑了我的问题,以显示课堂的样子。我该怎么做?这似乎不起作用。url模式现在看起来像,我得到了找不到的错误页面(404)。可能有什么问题?整个错误是找不到页面(404)请求方法:获取请求URL:引发者:blog.views.EntryView未找到与查询匹配的条目