2009-09-29 6 views
7

私は現在、Djangoのおもちゃプロジェクトに取り組んでいます。私のアプリのDjango slugified urls - どのように衝突を処理するのですか?

一部は、ユーザーがレビューを残すことができます。私はレビューのタイトルを取得し、URLを作成するためにそれをslugifyしたいと思います。 www.example.com/reviews/the-best-thing-ever:ユーザーが「!史上最高のもの」と呼ばれるレビューを書き込むと

ので、URLは次のようになります。

すべてが順調と良いですが、2人のユーザーが同じタイトルを選ぶケースを処理するための最良の方法は何ですか?私はタイトルがユニークであることを要求することを望んでいません。

私はどこかURLでレビューIDを追加することについて考えてきましたが、私は衝突しない任意のURLのは、余分な情報を避けるためにしたいと思います。

アイデア?当然の

答えて

6

ことの一つは、単一のタイトルのために衝突の多くを持っている場合、あなたは試してみて、可能なスラグを判断するには、いくつかのクエリを実行する羽目になるということです。私はあなたが非衝突のナメクジのIDを表示したくないと述べたことを知っているが、パフォーマンスに関しては、それが良いルートだと思う。 URLを少し見やすくするために、IDをスラッグの前に埋め込むことも望ましいので、URLはwww.example.com/reviews/1/the-best-thing-everの形式になります。

+0

、スラグが使用されているかどうかを確認し、それに何かを追加私は考えていましたが、この場合、スラグは無意味な目のキャンディーであることが判明しました。それは速いですが、この問題からあなたを完全に解放します。 "本当の"アプリではおそらくこのルートをとるだろうが、私はまだこれをどう扱うのかに関心があり、衝突しないURLにはすべてのIDが全くないことを認めている。 –

+1

私はまた、あなたがURLバーを見ているなら、これはSOが使用するのと同じアプローチであるように思えます:) –

+0

それはいい会社のようです。すべてのIDを削除する限り、他の2つの回答は間違いなく進んでいます。私が最初にスラッグを開始したとき、私はどこかで見つけたユニークなスラグの方法を使用しました(Zalewが投稿したものとほぼ同じです)。 – Adam

2
from django.template.defaultfilters import slugify 

def slugify_unique(value, model, slugfield="slug"): 
     suffix = 0 
     potential = base = slugify(value) 
     while True: 
      if suffix: 
       potential = "-".join([base, str(suffix)]) 
      if not model.objects.filter(**{slugfield: potential}).count(): 
       return potential 
      suffix += 1  
""" 
above function is not my code, but i don't remember exactly where it comes from 
you can find many snippets with such solutions searching for 'unique slug' and so 
""" 


class ReviewForm(forms.ModelForm): 

    def save(self, user, commit=True):  
     self.instance.slug = slugify_unique(self.cleaned_data['title'], self.Meta.model)      
     review = super(ReviewForm, self).save(commit) 
     review.save() 
     return review 

    class Meta: 
     model = Review 

適切な名前とフォームの定義を変更しますが、アイデアを得る:)

6

私はAutoSlugFieldのようなものをお勧めします。独自性の設定(uniqueunique_with)にはいくつかのオプションがあり、モデルの別のフィールドに基づいて自動的にスラグを生成できるという利点があります。私はユニークスラッグフィールド/メソッドについて言ったことがない

0

私は(フォームの検証で)するのと同じこれは、溶液のいずれかで番号「私の-クールidea_2」または実際のid

関連する問題