문제

저는 현재 Django에서 장난감 프로젝트를 진행하고 있습니다.

내 앱의 일부를 통해 사용자는 리뷰를 남길 수 있습니다. 리뷰의 제목을 가져 와서 URL을 만들기 위해 슬러지하고 싶습니다.

따라서 사용자가 "The Best Thing Ever!"라는 리뷰를 작성하면 URL은 다음과 같습니다. www.example.com/reviews/the-best-thing-ever.

그것은 모두 훌륭하고 좋지만 두 사용자가 같은 제목을 선택하는 케이스를 처리하는 가장 좋은 방법은 무엇입니까? 제목을 독특해야합니다.

어딘가에 URL에 리뷰 ID를 추가하는 것에 대해 생각했지만 충돌하지 않는 URL에 대한 추가 정보를 피하고 싶습니다.

어떤 아이디어?

도움이 되었습니까?

해결책

독특한 슬러그 필드/메소드에 대해 내가 결코 좋아하지 않은 한 가지는 단일 제목에 대한 충돌이 많으면 몇 가지 쿼리를 실행하여 사용 가능한 슬러그를 결정한다는 것입니다. 나는 당신이 비 클래싱 슬러그에 대한 ID를 보여주고 싶지 않다고 언급했지만, 성능에 이르기까지는 그것이 더 나은 경로라고 생각합니다. URL을 조금 더 멋지게 보이게하려면 슬러그 전에 ID를 포함하여 URL이 www.example.com/reviews/1/the-best-thing-ever의 형태를 취하도록 선호합니다.

다른 팁

나는 같은 것을 추천 할 것입니다 AutoSlugfield. 고유성 구성과 관련하여 사용할 수있는 몇 가지 옵션이 있습니다 (unique 그리고 unique_with), 그리고 선택한 경우 모델의 다른 필드를 기반으로 슬러그를 자동으로 생성 할 수 있다는 이점이 추가됩니다.

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

물론 적절한 이름과 양식 정의를 변경하지만 아이디어를 얻습니다 :)

(양식 검증에서) 슬러그가 사용되는지 확인한 다음 숫자 "my-cool-idea_2"또는 실제 ID를 추가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top