【问题标题】:how to redirect a url with pk to url with pk and slug in django?如何在django中将带有pk的url重定向到带有pk和slug的url?
【发布时间】:2014-07-12 02:45:27
【问题描述】:

当用户在下方输入此网址时

www.example.com/1234

他必须被重定向到

www.example.com/1234/this-is-your-first-post

例如,如果你试试这个:

 http://stackoverflow.com/questions/15443306/

您将被重定向到

http://stackoverflow.com/questions/15443306/hover-menu-in-right-side-of-fixed-div

实际上它不是redirect,它只是将url 自动扩展为slug field

我想实现这个功能: 这是我的模型

class Article(models.Model):
    title = models.CharField(max_length=20)
    body = models.TextField()
    # image = models.ImageField(upload_to="/", blank=True, null=True)
    date = models.DateField()
    likes = models.IntegerField()
    slug = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super(Article, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('article_detail', kwargs={'slug':self.slug, 'pk':self.id})

    def __unicode__(self):
        return self.title

这是我的应用程序中的urls.py

urlpatterns = patterns('',
    url(r'all$', ArticleList.as_view(), name='blog_all'),
    url(r'^(?P<pk>\d+)/(?P<slug>[-\w\d]+)/$', ArticleDetail.as_view(), name='article_detail'),
    )

【问题讨论】:

    标签: django django-urls http-redirect


    【解决方案1】:

    只需添加另一个收集信息和重定向的视图:

    class ArticleDetailRedirect(RedirectView):
    
        def get_redirect_url(self, pk):
            article = Article.objects.get(pk=pk)
            slug = article.slug
            return reverse('article_details', args=(pk, slug))
    

    然后将其连接到您的urls.py

    urlpatterns = patterns('',
        url(r'all$', ArticleList.as_view(), name='blog_all'),
        url(r'^(?P<pk>\d+)/$', ArticleDetailRedirect.as_view(), name='article_redirect'),
        url(r'^(?P<pk>\d+)/(?P<slug>[-\w\d]+)/$', ArticleDetail.as_view(), name='article_detail'),
        )
    

    【讨论】:

    • 花了一整天,但最后这个答案会让我睡觉。谢谢!!
    【解决方案2】:

    这是实际上重定向,用于 SEO 目的。您需要基于RedirectView 创建一个视图并将用户重定向到带有 slug 的页面:

    class ArticleRedirectView(RedirectView):
        """ Will make a HTTP 301 redirection from blog/1/ to blog/1/slug_of_article """
        def get_redirect_url(self, *args, **kwargs):
            article = get_object_or_404(Article, pk=pk)
            return reverse('article_detail', args=(pk, slug))
    
    
    urlpatterns = patterns('',
        url(r'all$', ArticleList.as_view(), name='blog_all'),
        url(r'^(?P<pk>\d+)/$', ArticleRedirectView.as_view()),
        url(r'^(?P<pk>\d+)/(?P<slug>[-\w\d]+)/$', ArticleDetail.as_view(), name='article_detail'),
    )
    

    【讨论】:

      【解决方案3】:

      万一有人遇到这种情况。我想简单地重定向并传入 pk 作为关键字参数。假设我们有一个Article 模型

      # views.py
      from django.shortcuts import redirect
      
      def article_create(request):
          article_form = ArticleForm(request.POST)
          if article_form.is_valid():
              article = article_form.save()
              return redirect("articleDetail", pk=article.id)
      
      # urls.py
      from django.urls import path
      
      urlpatterns = [
          path('article/create', views.article_create, name="articleCreate")
          path('article/<int:pk>', views.article_detail, name="articleDetail")
      ]
      

      【讨论】:

        猜你喜欢
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        • 2015-04-19
        • 2018-05-18
        • 2019-10-21
        • 1970-01-01
        • 2013-07-07
        相关资源
        最近更新 更多