我希望这只是我对正则表达式理解不好的一个问题。我正在尝试使用Django 1.9's generic views上的完全相同的代码来构建博客和个人网站,并且,在测试过程中,我遇到了麻烦:
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中的详细视图如下所示:
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的关键字生成器,但我不确定它是如何工作的(或者不是,就像这个例子一样)。然后,最后,在我和文档一起学习的教程和文档本身中,我并不完全理解模板中的变量名来自哪里(我的理解是,请求命中的是从views.py生成数据的URL )。模板中的"ListView“对象共享模型名称"post”(或文档中的“文章”),其底部的页面视图只需通过"page_obj“访问,而"DetailView”对象则简称为" object“。我也可能在对我的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中缺少一个插件。
发布于 2016-03-26 04:18:39
理想情况下,您应该在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])如果你硬编码URL,它应该包含一个前导斜杠。
def get_absolute_url(self):
return "/%s/" % (self.slug)如果first_post.get_absolute_url返回带有当前get_absolute_url的主页url,则表明该slug是一个空字符串。
https://stackoverflow.com/questions/36227080
复制相似问题