【问题标题】:Bad Regex in Django? DetailView, ListView, and blog constructionDjango中的错误正则表达式? DetailView、ListView、博客搭建
【发布时间】:2016-07-13 15:08:36
【问题描述】:

我希望这只是我对正则表达式理解不佳的一个问题。 我正在尝试使用 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的Detailview如下:

    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”(或文档中的“article”),其底部的pageview只需通过“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 中缺少 slug。

【问题讨论】:

    标签: python regex django detailview


    【解决方案1】:

    理想情况下,您应该在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 返回主页网址,则表明该slug 是一个空字符串。

    【讨论】:

    • 等一下 - 我有点困惑。您是否将def get_absolute_url(self): 移动到views.py 中的PostDetailView 类?这有点令人困惑。另外,我从前导斜杠开始,但 print 语句给了我“//”,所以,当我删除前导斜杠时,我得到了“/”。
    • 抱歉,打错了,get_absolute_url 方法属于 Post 模型。
    • 如果您通过打印绝对 url 得到 "//",请检查您的 slug 字段是否被填充。通常您必须自己创建它,它不是像您的 pub_date 字段或 PK 这样的自动字段。至少在模型级别,有一些管理员选项可以让管理员根据其他字段 IIRC 设置它。
    • 如果打印语句显示//,则表示slug是空字符串''。通常,slug 是标题的简化版本,适用于 URL。例如,如果标题是 My first blog post,那么 slug 可能是 my-first-blog-post。您可以为您的模型设置 slug,它们不会在创建帖子时自动生成。您可能会发现 prepopulated_fields 模型管理选项很有用。
    • 我没有使用过 factory boy,但看起来你需要在 PostModelFactory 中包含类似 slug = 'this-is-a-test' 的内容。正如彼得所说,您的回溯与我的答案不符。
    猜你喜欢
    • 2016-07-30
    • 2015-07-10
    • 1970-01-01
    • 2018-05-27
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多