Django 中的 Slugfield URL 实现

Posted

技术标签:

【中文标题】Django 中的 Slugfield URL 实现【英文标题】:Slugfield URL implementation in Django 【发布时间】:2015-08-05 18:16:40 【问题描述】:

所以,我在尝试对模型中的标题字段进行 slugify 并仍然让它返回正确的信息时遇到了一些困难。

目前,如果用户帐户中的列表存在于此正则表达式下,则用户可以关注该网址:

url(r'^user/(?P<username>\w+)/list/(?P<listname>\w+)/$', mylistpage, name='lists'),

我面临的问题是用户可以有一个包含空格的列表,但正则表达式基于他们的列表名称他们的 url。我想实现一个 slug url,但仍然让它检索正确的模型/对象信息。

我试图拥有一个 slug 字段,然后根据列表名称预先填充它,但我不知道这个实现应该如何工作。非常感谢任何见解。

型号

class newlist(models.Model):


    user = models.ForeignKey(User)
    list_name = models.CharField(max_length = 100,)
    picture = models.ImageField(upload_to='profiles/', default = "/media/profiles/default.jpg")
    slugurl = models.SlugField(default = slugurl(self))

    def __str__(self):
        return self.list_name

    def slugurl(self):
        return slugify(self.list_name)

观看次数

def mylistpage(request, username, listname):

    context = RequestContext(request)

    #make sure that the user is authenticated
    if username == request.user.username:
        #If the user is authenticated, then perform the following functions to the page
        if request.user.is_authenticated():
            #Store the current user request object into a variable
            user = User.objects.get(username=username)

            #Store the list name to the item that starts with the url input
            listname = request.user.newlist_set.filter(list_name__iexact=listname)

            listitems = request.user.newlist_set.all()
            if not listname:
                return redirect('/notfound')
    else:
        return redirect('/notfound')

    return render_to_response('listview.html', 'lista': listname, context)

【问题讨论】:

【参考方案1】:

我使用django-autoslug 取得了巨大的成功。你可以找到一个活生生的例子here。

SlugField 只是一个带有 little syntactic sugar. 的字符字段

您需要将您的 slug 命名为 slug,以便 django 可以在 URL 解析中自动找到它并将正确的参数传递给视图。

您修改后的代码如下所示:

from autoslug import AutoSlugField
from django.db import models

class Newlist(models.Model): # Classes start with uppercase names by default
    user = models.ForeignKey(User)
    list_name = models.CharField(max_length = 100,)
    picture = models.ImageField(upload_to='profiles/', default = "/media/profiles/default.jpg")
    slug = AutoSlugField(populate_from='list_name')
    def __str__(self):
        return self.list_name

您的看法:

def mylistpage(request,username, slug):

    context = RequestContext(request)

    #make sure that the user is authenticated
    if username == request.user.username:
        #If the user is authenticated, then perform the following functions to the page
        if request.user.is_authenticated():
            #Store the current user request object into a variable
            user = User.objects.get(username=username)

            #Store the list name to the item that starts with the url input
            listname = request.user.newlist_set.filter(slug=slug)

            listitems = request.user.newlist_set.all()
            if not listname:
                return redirect('/notfound')
    else:
        return redirect('/notfound')

    return render_to_response('listview.html', 'lista': listname, context)

urls.py

url(r'^user/(?P<username>\w+)/list/(?P<slug>[\w-]+)/$', mylistpage, name='lists'),

【讨论】:

啊,对了。那么如何更改 url 和/或视图以适应这种集成? 它还强制我为该字段提供一次性默认值,有没有关于应该填写什么的建议? 你在生产吗?如果您正在开发和/或独自工作而没有要迁移的数据,我建议您删除迁移并从头开始运行 makemigrations。 只是本地的。我让 autoslug 填充到我的数据库中。很酷的图书馆。不过,想知道如何在我的 url 中使用这个 slug。 实际上只是在您发布之前就想通了,但是我检查了您链接的那个 github 的来源并且它有所帮助。非常感谢!完美解决我的问题

以上是关于Django 中的 Slugfield URL 实现的主要内容,如果未能解决你的问题,请参考以下文章

django models.SlugField 怎么使用

为啥在 Django 中使用 SlugField()?

如何在 Django 通用列表视图类中使用 slugfield 创建链接?

为啥我需要在 Django 中使用 SlugField?

重定向视图中的 Django NoReverseMatch 错误

Django奇怪的SlugField验证,在clean()之前没有引发错误,返回了未清理的数据