2009-09-29 2 views
7

저는 현재 장고에서 장난감 프로젝트를하고 있습니다.Django slugified urls - 충돌을 처리하는 방법?

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

그래서 사용자가 "The best thing ever!"라는 리뷰를 작성하면 URL은 www.example.com/reviews/the-best-thing-ever과 같을 것입니다.

모두 훌륭하지만 좋은 두 사람이 같은 제목을 선택하는 경우를 처리하는 가장 좋은 방법은 무엇입니까? 고유해야하는 제목을 만들고 싶지 않습니다.

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

아이디어가 있으십니까? 물론

답변

6

고유 한 슬러그 필드/메소드에 대해 결코 좋아하지 않는 한 가지 사실은 단일 타이틀에 대해 많은 충돌이 발생하면 사용 가능한 슬러그를 시도하고 결정하기 위해 여러 가지 쿼리를 실행하게된다는 것입니다. 나는 당신이 비 충돌 굼벵이에 대한 이드를 보여주고 싶지 않다고 언급했음을 알고 있습니다. 그러나 성능면에서 볼 때 더 나은 방법이라고 생각합니다. URL을 조금 더 멋지게 보이게 만들려면 URL을 www.example.com/reviews/1/the-best-thing-ever의 형식으로 지정해야합니다.

+0

, 슬러그를 사용하는 경우보고, 다음에 무언가를 추가 확인 (양식 유효성 검사에서) 나는이 경우 슬러그가 무의미한 눈 사탕으로 밝혀졌지만 생각하고있었습니다. 그것은 빠르지 만이 문제에서 완전히 벗어나게 해줍니다. "진짜"응용 프로그램에서는 아마도이 경로를 취할 것이지만 나는 여전히 이것을 처리하고 충돌하지 않는 URL이 어떤 ID에서도 완전히 자유롭도록 할 수있는 방법에 관심이 있습니다. –

+1

나는 이것이 URL 바를 훑어 본다면 SO가 사용하는 것과 같은 접근법 인 것 같다. :) –

+0

그럼 나는 좋은 회사에있는 것처럼 보입니다. 모든 ID를 제거하는 것과 같이 다른 두 가지 대답이 반드시 필요합니다. 원래 슬러 깅을 시작했을 때, 나는 어딘가에서 발견 한 독특한 슬러그 메서드를 사용했습니다 (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

I 하듯이이 솔루션 중 숫자 "내-냉각 idea_2"또는 실제 ID

관련 문제