如何将带有pk的URL重定向到带有Django中pk和slug的URL?

问题描述 投票:3回答:3

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

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
3个回答
2
投票

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

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创建一个视图,并将用户重定向到该页面,并显示以下内容:

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'), )

0
投票
[如果有人遇到此问题。我只想重定向并传入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") ]

© www.soinside.com 2019 - 2024. All rights reserved.