7

私は現在、Djangoでおもちゃのプロジェクトに取り組んでいます。

私のアプリの一部では、ユーザーがレビューを残すことができます。レビューのタイトルを取得し、それをスラッグ化してURLを作成したいと思います。

したがって、ユーザーが「史上最高のもの」というレビューを書いた場合、URLは次のようになりますwww.example.com/reviews/the-best-thing-ever

それはすべてうまくいっていますが、2人のユーザーが同じタイトルを選んだ場合を処理するための最良の方法は何ですか?必要なタイトルを一意にしたくありません。

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

何か案は?

4

4 に答える 4

6

固有のスラッグ フィールド/メソッドについて私が気に入らなかった点の 1 つは、1 つのタイトルに対して多くの衝突が発生した場合、使用可能なスラッグを特定するためにいくつかのクエリを実行することになることです。衝突しないスラッグの ID を表示したくないとおっしゃっていましたが、パフォーマンスに関しては、それがより良い方法だと思います。URL の見栄えを良くするために、スラッグの前に id を埋め込むことも好みます。これにより、URL は www.example.com/reviews/1/the-best-thing-ever の形式になります。

于 2009-09-29T14:25:10.510 に答える
6

AutoSlugFieldのようなものをお勧めします。unique一意性 (および) の構成に関して利用可能ないくつかのオプションがありunique_with、必要に応じて、モデルの別のフィールドに基づいてスラッグを自動的に生成できるという追加の利点があります。

于 2009-09-29T05:21:33.197 に答える
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

もちろん、適切な名前とフォーム定義を変更しますが、アイデアはわかります:)

于 2009-09-29T04:53:03.720 に答える
0

(フォームの検証で)スラッグが使用されているかどうかを確認し、数値「my-cool-idea_2」または実際のIDのいずれかを追加します

于 2010-02-26T07:24:34.443 に答える