[英]Bad Regex in Django? DetailView, ListView, and blog construction
我希望这只是我对正则表达式了解不足的问题。 我试图在Django 1.9的通用视图上使用确切的代码来构建博客和个人网站,直到测试,这是我遇到麻烦的地方:
def test_post_page(self):
post = PostModelFactory()
first_post = Post.objects.all()[0]
post_url = first_post.get_absolute_url()
print(post_url)
response = self.client.get(post_url, follow=True)
self.assertEqual(response.status_code, 200)
因此,通过该打印语句,我确定了models.Post.get_absolute_url()
返回了我的主页URL。 这是models.py:
class Post(models.Model):
title = models.CharField(max_length=200)
subtitle = models.CharField(max_length=200, default="")
pub_date = models.DateTimeField(auto_now_add=True)
text = models.TextField()
slug = models.SlugField(max_length=40,unique=True)
def get_absolute_url(self):
return "%s/" % (self.slug)
如果出现,我复制了通用视图文档的内容,因此我在/blog/urls.py
中的/blog/urls.py
如下:
url(r'^(?P<slug>[-\w]+)/$', PostDetailView.as_view(), name='post-detail'),
与views.py
相同:
class PostDetailView(DetailView):
model = Post
def get_context_data(self, **kwargs):
context = super(PostDetailView, self).get_context_data(**kwargs)
context['now'] = timezone.now()
return context
据我所知,我的get_absolute_url()函数根本没有执行我认为正在执行的操作,更不用说urls.py中的正则表达式期望它执行的操作了。
另外:有没有人可以完全解释slugfield的工作原理? 我知道这是创建URL的关键字生成器,但是我不确定它的工作方式(或不起作用,如本例所示)。 然后,最后,在我和文档一起进行的后续教程以及文档本身中,我还没有完全理解模板中变量名的来源(我的理解是请求命中的是URL ,它从views.py生成数据)。 模板中的“ ListView”对象共享模型名称“ post”(或文档中的“文章”),其底部的综合浏览量仅通过“ page_obj”即可访问,“ DetailView”对象简称为“宾语”。 我对ListView进行分页时可能也会遇到问题(与文档示例相同,但在get_context_data
上方有额外的行paginate_by = 2
。
谢谢。
编辑:
我包括了PostModelFactory:
class PostModelFactory(DjangoModelFactory):
class Meta:
model = Post()
django_get_or_create = (
'title',
'subtitle',
'text',
'pub_date',
)
title = 'This is a test.'
subtitle = 'This is only a test.'
text = 'Madness? This is Sparta.'
pub_date = timezone.now()
def __init__(self):
self.save()
编辑:问题原来是在PostModelFactory中没有a。
理想情况下,您应该在get_absolute_url
使用reverse
,而不是对其进行硬编码。
from django.core.urlresolvers import reverse
class Post(models.Model):
...
def get_absolute_url(self):
return reverse('post-detail', args=[self.slug])
如果您对网址进行硬编码,则该网址应包含一个斜杠。
def get_absolute_url(self):
return "/%s/" % (self.slug)
如果first_post.get_absolute_url
返回带有当前get_absolute_url
的主页URL,则表明first_post.get_absolute_url
是空字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.