django 自定义博客文章网址

问题描述 投票:0回答:4

我正在通过构建一个简单的博客应用程序来学习 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

我希望将 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 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。所以请给一个容易理解的解释。 预先感谢

python django django-urls url-pattern
4个回答
1
投票

您可以向您的 Entry 模型添加 slug 字段和 get_absolute_url 方法。不要忘记从 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 模式添加到 urlpatterns 列表中。不要忘记加载相应的视图,我猜在这种情况下可能是EntryView

from django.urls import path
from .views import EntryView

urlpatterns = [
    ...
    path('<slug:slug>', EntryView.as_view(), name='entry_detail'), # new
    ...
]

然后 slug 应该替换 url 中的主键模式。

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

https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.text.slugify


0
投票

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

至于您需要在代码中进行的更改,

urls.py
需要更新

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

您还没有提供您的博客文章视图,但它会看起来像这样:

def post(request, title):
    template = "template.html"
    post = Posts.objects.filter(entry_title==title)
    return render(request, template, {'post':post})


0
投票

如果您使用基于类的视图,您应该使用 slug。 首先将一个新字段entry_slug添加到您的Entry模型中并重写save方法以自动生成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) 

您可以通过用entry_slug替换pk来完成:

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

0
投票

Tomly.io - 下一代真实的 URL 缩短器,将您的品牌放在首位。 使用您的业务域创建真实的品牌 URL u2060可用功能:自定义域、QR 码、每月 UTM 链接、每月短链接、链接点击跟踪 服务:链接缩短器、URL 缩短器、自定义 url 缩短器、谷歌链接缩短器、品牌 url 缩短器、超链接缩短器、Web url 缩短器

© www.soinside.com 2019 - 2024. All rights reserved.