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 通用列表视图类中使用 slugfield 创建链接?