2014-09-03 42 views
1

变更网址标题,如果ID发生变化 - Django的

def newsprofile(request, newstitle, newsid): 
    newsobj = get_object_or_404(NewsModel, pk=int(newsid)) 
    return render(request, 'newsprofile.html', {'newsobj': newsobj}) 

但现在,如果我改变ID 12里面adressbar网址并点击例如,输入按钮/sometitle_and_and_blabla/1/

我会得到另一个消息,但标题亘古不变的变化,它只是变得像:

/sometitle_and_and_blabla/2/ 

如何更改标题也如果ID发生变化?

的urls.py看起来是这样的:

url(r'^news/(?P<newstitle>[^\/]*)/(?P<newsid>\d+)/$', 'newsprofile', name='newsprofile'), 
+0

你还可以显示你的'urls.py'相关配置吗?谢谢。 – alecxe 2014-09-03 14:54:52

+0

@alecxe是的,我更新了q。 – doniyor 2014-09-03 14:56:21

+0

谢谢,你想在视图中匹配新闻标题和编号吗?换句话说,如果新闻'1'具有'title = sometitle_and_and_blabla',那么URL'/ sometitle_and_and_blabla/2 /'会返回404 - 这是你期望的行为吗? – alecxe 2014-09-03 14:59:41

回答

3

尝试这样,

def newsprofile(request, newstitle, newsid): 
    newsobj = get_object_or_404(NewsModel, pk=int(newsid)) 
    if newstitle != newsobj.newstitle: 
     return HttpResponsePermanentRedirect('/%s/%s/' % (newsobj.newstitle, newsid)) 

    ..... 
+1

谢谢,听起来不错 – doniyor 2014-09-03 15:03:34

+0

哦,男的,我差点生气了,没看见''和''。请更新a。它应该是''''''D – doniyor 2014-09-03 15:16:08

1

当你使用命名的网址(例如newsprofile)以下笔者推荐的解决方案。这是灵活的,易于维护,即使您的网址,只要您使用相同的URL参数的变化:

from django.http import HttpResponseRedirect 
... 

def newsprofile(request, newstitle, newsid): 
    newsobj = get_object_or_404(NewsModel, pk=int(newsid)) 

    if newsobj.newstitle != newstitle: 
     return HttpResponseRedirect(reverse("newsprofile", args=[newstitle, newsid])) 

    return render(request, 'newsprofile.html', {'newsobj': newsobj}) 

针对URL的反向解析见Django docs here

+0

谢谢,非常有用的提示 – doniyor 2014-09-03 15:20:20