带有自定义参数的Django DetailView + urls

时间:2015-12-14 23:50:36

标签: python django

Django中简化版的论坛应用。我想要做的是拥有forum/forum_slug/thread_slug/形式的网址。我不知道如何定义自定义forum_slug并将其传递给urlpatterns。

# models.py
class Forum(models.Model):
    title = models.CharField(max_length=60)
    slug = models.CharField(max_length=60)

    # ...

    def threads(self):
        _threads = Thread.objects.filter(forum=self)
        return _threads


class Thread(models.Model):
    title = models.CharField(max_length=60)
    slug = models.CharField(max_length=60)
    forum = models.ForeignKey(Forum)

    # ...

    def get_absolute_url(self):
        return '/%s/%s' % (self.forum.slug, self.slug)


class Post(models.Model):
    title = models.CharField('Title', max_length=60)
    thread = models.ForeignKey(Thread)

    # ...



# ******************************************************
# views.py
# ******************************************************
class ForumDetail(MetadataMixin, DetailView):
    model = Forum
    context_object_name = 'forum'
    template_name = 'forum/forum.html'

    name='forum'

    # meta...


class ThreadDetail(MetadataMixin, DetailView):
    model = Thread
    context_object_name = 'thread'
    template_name = 'forum/thread.html'
    name = 'thread'

    # meta...



# ******************************************************
# urls.py
# ******************************************************
urlpatterns = patterns('',
    url(r'^$', 
        'forum.views.index',
        name='index'
        ),

    url(r'^(?P<slug>[a-zA-Z0-9-]+)/?$', 
        ForumDetail.as_view()),

    # here it comes
    url(r'^(?P<forum_slug>[a-zA-Z0-9-]+/?P<slug>[a-zA-Z0-9-]+)/?$', 
        ThreadDetail.as_view()),
    )

2 个答案:

答案 0 :(得分:0)

我假设你想要slugs的URL模式。以下是您可以尝试的示例。

# URL example: /forum/this-is-a-forum-1/this-is-a-thread-1/
url(r'^forum/(?P<forum_slug>[\w-]+)/(?P<thread_slug>[\w-]+)$', ThreadDetail.as_view()),

希望这会有所帮助。

答案 1 :(得分:0)

@rayy:谢谢。不,这不是我想要的 - 我根本就不知道如何在其中定义forum_slug。这就是我所要求的。 :-)嗯,我想出了一个更冗长的解决方案,但坦率地说,我不喜欢它:

# models.py
from django.core.urlresolvers import reverse

class Thread(models.Model):
    #... like before
    def get_absolute_url(self):
        return reverse('thread_url', (), {'forum_slug': self.forum.slug, 'slug': self.slug})

# urls.py
urlpatterns = patterns('',
    # ...
    url(r'^(?P<forum_slug>[\w-]+)/(?P<slug>[\w-]+)/$', ThreadDetail.as_view(), name='thread_url'),)

# index.html / forum.html (in a loop)
<a href="{% url 'forum: thread_url' forum_slug=forum.slug slug=thread.slug %}">{{thread.title}}</a>