2009-09-29 23 views
7

Actualmente estoy trabajando en un proyecto de juguete en Django.Urls comprimidos de Django: ¿cómo manejar las colisiones?

Parte de mi aplicación permite a los usuarios dejar sus comentarios. Me gustaría tomar el título de la crítica y escribirla para crear una url.

Por lo tanto, si un usuario escribe una reseña llamada "¡Lo mejor de lo mejor!", La url sería algo así como: www.example.com/reviews/the-best-thing-ever.

Eso está muy bien, pero ¿cuál es la mejor manera de manejar el caso donde dos usuarios eligen el mismo título? No quiero que el título requerido sea único.

He pensado en agregar el ID de revisión en la url en algún lugar, pero me gustaría evitar esa información adicional para las URL que no colisionan.

¿Alguna idea?

Respuesta

6

Una cosa que nunca me gustó de los campos/métodos únicos de babosas es que si tiene muchos enfrentamientos para un solo título, terminará ejecutando varias consultas para intentar determinar una babosa disponible. Sé que mencionaste que no quieres mostrar la identificación de las babosas que no están en conflicto, pero, en lo que respecta al rendimiento, creo que es la mejor ruta a seguir. Para que la URL tenga un aspecto más agradable, también prefiero insertar la identificación antes de la babosa, de modo que una URL tome la forma de www.example.com/reviews/1/the-best-thing-ever.

+0

Esta es la solución Estaba considerando, aunque en este caso, Slug resulta ser un caramelo sin sentido. Sin embargo, es rápido y te libera completamente de este problema. En una aplicación "real", probablemente tomaría esta ruta, pero aún estoy interesado en cómo manejar esto y aún permitir que las URL que no colisionan estén totalmente libres de identificadores. –

+1

También debería tener en cuenta que este parece ser el mismo enfoque que utiliza SO, si echas un vistazo a la barra de direcciones :) –

+0

Bueno, parece que estoy en buena compañía. En cuanto a la eliminación de todos los identificadores, las otras dos respuestas son definitivamente el camino a seguir. Cuando originalmente comencé a hacer slugging, utilicé un método único de babosas que encontré en algún lugar (es casi idéntico al que publicó 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 

, por supuesto, cambiar los nombres apropiados y de definición de formulario, pero usted consigue la idea :)

6

recomendaría algo así como AutoSlugField. Tiene algunas opciones disponibles con respecto a la configuración de exclusividad (unique y unique_with), y tiene la ventaja adicional de poder generar babosas automáticamente en función de otro campo en su modelo, si así lo desea.

0

lo haría (en la validación de formularios) acaba de comprobar para ver si se utiliza la babosa, y luego añadir algo a ella, ya sea un número "mi-cool-idea_2" o el ID real

Cuestiones relacionadas