2009-09-29 16 views
7

Obecnie pracuję nad projektem zabawkowym w Django.Sludified adresy URL Django - jak radzić sobie z kolizjami?

Część mojej aplikacji umożliwia użytkownikom opuścić recenzje. Chciałbym wziąć tytuł recenzji i przerobić go, by utworzyć adres URL.

Tak więc, jeśli użytkownik napisze recenzję pod tytułem "Najlepsza rzecz w życiu", adres URL będzie wyglądał następująco: www.example.com/reviews/the-best-thing-ever.

Wszystko dobrze i dobrze, ale jaki jest najlepszy sposób postępowania w przypadku, gdy dwóch użytkowników wybiera ten sam tytuł? Nie chcę, aby tytuł był unikalny.

Zastanowiłem się nad dodaniem w moim adresie URL oceny, ale chciałbym uniknąć dodatkowych informacji na temat adresów URL, które się nie kolidują.

Wszelkie pomysły?

Odpowiedz

6

Jedną z rzeczy, których nigdy nie lubiłem w unikalnych polach/metodach slug, jest to, że jeśli masz dużo konfliktów na jeden tytuł, skończy się kilka zapytań, aby spróbować określić dostępny ślimak. Wiem, że wspomniałeś, że nie chcesz wyświetlać identyfikatora dla nie kolidujących ze sobą ślimaków, ale jeśli chodzi o wydajność, to myślę, że jest to lepsza droga. Aby adres URL wyglądał ładniej, wolę też umieścić identyfikator przed plikiem, aby adres URL miał postać www.example.com/reviews/1/the-best-thing-ever.

+0

To rozwiązanie Rozważałem, choć w tym przypadku, ślimak okazał się bezsensownym cukierkiem do oczu. Jest szybki i całkowicie uwalnia cię od tego problemu. W "prawdziwej" aplikacji pewnie bym podążał tą drogą, ale nadal jestem zainteresowany tym, jak sobie z tym poradzić i nadal pozwalać na to, by adresy URL, które nie są zderzające, były całkowicie wolne od jakichkolwiek identyfikatorów. –

+1

Należy również zauważyć, że wydaje się to być to samo podejście, które używa SO, jeśli spojrzysz w górę na pasek adresu URL :) –

+0

Cóż, wygląda na to, że jestem w dobrym towarzystwie. Jeśli chodzi o eliminowanie wszystkich identyfikatorów, dwie pozostałe odpowiedzi są zdecydowanie drogą do zrobienia. Kiedy początkowo zacząłem walić rzeczy, użyłem unikatowej metody ślimaka, którą gdzieś znalazłem (jest prawie identyczna z tą, którą opublikował 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 

oczywiście zmienić odpowiednich nazw i definicji formularza, ale masz pomysł :)

6

Polecam coś AutoSlugField. Ma kilka opcji dostępnych w odniesieniu do konfigurowania unikalności (unique i unique_with) i ma dodatkową zaletę, że jest w stanie automatycznie generować wtyczki na podstawie innego pola w modelu, jeśli tak zdecydujesz.

0

bym (w walidacji formularza) po prostu sprawdzić, czy używany jest ślimak, a następnie dodać coś do niego, albo numer „My-Cool-idea_2” lub rzeczywisty id

Powiązane problemy