python - 如何使用 slug 形成 url

标签 python django url slug

我的models.py文件看起来像这样

from django.db import models
from django.template.defaultfilters import slugify

class Entertainmentblog(models.Model):

    slug = models.SlugField(max_length=100)
    body = models.TextField()
    posted = models.DateTimeField('date published')
    img_url0 = models.CharField(max_length=100)
    img_alt0 =  models.CharField(max_length=100)
    title1 = models.CharField(max_length=100)
    title2 = models.CharField(max_length=100)


    def save(self):
        super(Entertainmentblog, self).save()
        self.slug = '%i-%s' % ( self.id, slugify(self.slug) )
        super(Entertainmentblog, self).save()

我的应用程序 urls.py 文件如下所示

from django.conf.urls import patterns, url
from entertainment import views
urlpatterns = patterns('',
    url(r'^$', views.ListView.as_view(), name='index'),
    url(r'^(?P<slug>[^\.]+),(?P<id>\d+)/$', views.DetailView.as_view(), name='article'),
)

但这会产生错误。

Exception Value: Reverse for 'article' with arguments '(u'what-is-happening',)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'entertainment/(?P[^\.]+),(?P\d+)/$']

我的view.py文件

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views import generic
from entertainment.models import Entertainmentblog
class ListView(generic.ListView, slug, id):
   template_name = 'entertainment/index.html'
   context_object_name = 'latest_article_list'

def get_queryset(self):

    return Entertainmentblog.objects.order_by('-posted')[:25]

class DetailView(generic.DetailView):
   model = Entertainmentblog
   template_name = 'entertainment/article.html'     

如何纠正这个问题?

最佳答案

哦,你的观点有严重问题:

第一:

class ListView(generic.ListView, slug, id)

应该是

class ListView(generic.ListView)

参见python inheritance .

第二:

slugid 必须是 View 的类成员,以便您可以像这样重新定义 View :

class ListView(generic.ListView):
   template_name = 'entertainment/index.html'
   context_object_name = 'latest_article_list'
   slug = None
   id = None

def get_queryset(self):

    return Entertainmentblog.objects.order_by('-posted')[:25]

第三:

您将派生类命名为其父类。我不知道这样做的含义,但肯定不是一个好的做法。

最后:

您收到的错误是因为 views.DetailView.as_view() 返回的 View (记住 DetailView 是您的派生类)不接收参数你正在通过网址。检查您的网址,我可以在提示的错误中看到参数 (u'what-is-happening',) 但没有 id。例如,它应该类似于 (u'what-is-happening', '4')

关于python - 如何使用 slug 形成 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206340/

相关文章:

python - 计算二元组频率

python - 如果socketIO实例是类成员变量,如何用flask-socketio修饰类函数?

python - 使用 pexpect (python) 时 SFTP 未完成文件传输

django - 用于扩展外部第三方 Django 应用程序的项目结构

javascript - 在不重新加载页面的情况下在 url 中 append 参数

python - 机器人区域映射 Python

django - Django:是否可以在一个通用 View 中验证和保存多种形式的字段?

Python 类覆盖

php - 使用 .htaccess 强制将 xxx.php URL 转发到 xxx

javascript - 提交前过滤表单参数