首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django的坏正则表达式?DetailView、ListView和博客建设

Django的坏正则表达式?DetailView、ListView和博客建设
EN

Stack Overflow用户
提问于 2016-03-26 03:56:49
回答 1查看 183关注 0票数 0

我希望这只是我对正则表达式理解不好的一个问题。我正在尝试使用Django 1.9's generic views上的完全相同的代码来构建博客和个人网站,并且,在测试过程中,我遇到了麻烦:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中的详细视图如下所示:

代码语言:javascript
复制
    url(r'^(?P<slug>[-\w]+)/$', PostDetailView.as_view(), name='post-detail'),

views.py也是如此

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中缺少一个插件。

EN

回答 1

Stack Overflow用户

发布于 2016-03-26 04:18:39

理想情况下,您应该在get_absolute_url中使用reverse,而不是硬编码它。

代码语言:javascript
复制
from django.core.urlresolvers import reverse

class Post(models.Model):
    ...
    def get_absolute_url(self):
        return reverse('post-detail', args=[self.slug])

如果你硬编码URL,它应该包含一个前导斜杠。

代码语言:javascript
复制
    def get_absolute_url(self):
        return "/%s/" % (self.slug)

如果first_post.get_absolute_url返回带有当前get_absolute_url的主页url,则表明该slug是一个空字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36227080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档