繁体   English   中英

如何将带有 pk 的 url 重定向到带有 pk 和 slug 的 django 的 url?

[英]how to redirect a url with pk to url with pk and slug in django?

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

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 ,它只是自动扩展带有slug fieldurl

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

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

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

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

实际上是一种重定向,用于 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'),
)

万一有人遇到这个。 我想简单地重定向并传入 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")
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM