2017-11-27 18 views
0

私は/ post/5post-titleや/ post/post-titleのようなslug urlを使ってみようとしています。私は現在の形でプレーンなURLを使用しています /ポスト/ 123、私は方法の多くを試みたが、すべてはhttps://keyerror.com/blog/slug-fields-an-alternative-approach私のジャンゴアプリにスラッグURLを追加できません

およびIから「主キー・ベースの検索からの移行」.. 今、私がしようとしています失敗しますbroswerエラーが発生しました。「多すぎるリダイレクト」...この問題を解決するにはどうすればよいですか、またはプレーンURLをスラッグURLに変更するためのより良い方法がありますか?

マイモデル:

class Post(models.Model): 

title,article and someFields....... 

def __str__(self): 
    return self.title 

def get_absolute_url(self): 
    return reverse('blog:detail',kwargs={'pk':self.pk}) 

def slug(self): 
    return slugify(self.title) 

と私のURL:

urlpatterns=[ 
url(r'^$',views.IndexView.as_view(),name='index'), 
url(r'^post/(?P<pk>[0-9]+)(?:/(?P<slug>[\w-]+))?$',views.detail,name='detail'),] 

私の見解:

def detail(request,pk,slug=None): 
post=get_object_or_404(Post,pk=pk) 
if slug!=post.slug(): 
    return redirect(post, permanent=True) 

return render(request,'blog/detail.html',context=context) 

SlugFieldモデルを使用し、PK削除:

class Post(models.Model): 
title=models.CharField(max_length=70) 
body=models.TextField() 
created_time=models.DateTimeField() 
modified_time=models.DateTimeField() 
excerpt=models.CharField(max_length=200,blank=True) 
category=models.ForeignKey(Category) 
tags=models.ManyToManyField(Tag,blank=True) 
author=models.ForeignKey(User) 
views=models.PositiveIntegerField(default=0) 
excerpt=models.CharField(max_length=100,blank=True) 
sluglookup = models.SlugField(
    unique=True, 
    default=Post.slug, 
    max_length=15,) 

def __str__(self): 
    return self.title 

def get_absolute_url(self): 
    return reverse('blog:detail',kwargs={'pk':self.pk}) 

def increase_views(self): 
    self.views+=1 
    self.save(update_fields=['views']) 
def save(self,*args,**kwargs): 
    if not self.excerpt: 
     md=markdown.Markdown(extensions=[ 
      'markdown.extensions.extra', 
      'markdown.extensions.codehilite', 
      ]) 
     self.excerpt=strip_tags(md.convert(self.body))[:54] 
    super(Post,self).save(*args,**kwargs) 
def slug(self): 
    return slugify(self.title) 

答えて

0

私はループがあなたのスラッグロジックではなく、404ページのロジックで問題であると思っています。上記に基づいて、あなたはURLを間違って使用しています。あなたの正規表現は/post/<pk>/<slug>を探します。あなたはURL /post/<pk><slug>を使用しています(追加の/に注意してください)。だから/post/5post-titleは本当に/post/5/post-titleになります。

また、純粋なスラッグベースのシステムを使用することに本当に関心がある場合は、後ほどの例のようにSlugFieldを使用し、主キーを完全に削除する必要があります。

url(r'^post/(?P<slug>[\w-]+)?$',views.detail,name='detail'), 

とビュー:

def detail(request,slug=None): 
    post=get_object_or_404(Post,lookup=slug) 

    # You probably have to pass the post into the render function, that 
    # will vary, based on how you've defined it in your template 
    return render(request,'blog/detail.html',context=context) 
+0

私はポストの下デフスラグ法(リターンslugify(self.title))を追加あなたはその後、URLをしたいと思います

lookup = models.SlugField( unique=True, default=self.slug, # This is not from the tutorial, it's a modification # to demonstrate here. max_length=13, ) 

私はそれを保存すると、 "(defalut = self.slug)name 'self'が定義されていない"この問題を回避するには、 – DumplingsYang

+0

' .slug' – cwallenpoole

+0

デフォルト= Post.slugに変更した後、それはまだ「ポストが定義されていない」上げ.....私はソースコードを上に置きます – DumplingsYang

0

私はにrecommnedどちらかそれはslugの値とどのようなpost.slug()の値が何であるかを言う前にreturn redirect(post, permanent=True)またはログにブレークポイントを置きます。私の知る限りifのソースを指定して、再帰的なリダイレクトのバグが発生する可能性がある唯一の一部であるように思われること、見ることができるように

。もちろん、私は間違っている可能性があります。

関連する問題