Pregunta

Actualmente estoy trabajando en un proyecto de juguete en Django.

Parte de mi aplicación permite a los usuarios dejar comentarios. Me gustaría tener el título de la revisión y slugear para crear una URL.

Por lo tanto, si un usuario escribe una revisión llamado "! Lo mejor que nunca", la URL sería algo así como: www.example.com/reviews/the-best-thing-ever.

Eso es todo muy bien, pero ¿cuál es la mejor manera de manejar el caso en el que dos usuarios elegir el mismo título? No quiero hacer el título requerido para ser único.

He pensado en añadir la revisión id en la url en alguna parte, pero me gustaría evitar que información adicional para cualquier URL que no entran en colisión.

¿Alguna idea?

¿Fue útil?

Solución

Una cosa que no me gustó de la babosa campos / métodos únicos es que si usted tiene una gran cantidad de choques para un solo título, que terminará ejecutar varias consultas para tratar de determinar una babosa disponible. Sé que usted ha mencionado que no desea mostrar la Identificación de las babosas no enfrentadas, pero, en cuanto a rendimiento, creo que es la mejor ruta a tomar. Para hacer la URL un poco más agradable que mira, prefiero también para incrustar la identificación antes de la babosa, de manera que una URL toma la forma de www.example.com/reviews/1/the-best-thing-ever.

Otros consejos

Yo recomendaría algo así como AutoSlugField . Que tiene unas cuantas opciones disponibles con respecto a la configuración de la singularidad (unique y unique_with), y tiene la ventaja añadida de ser capaz de generar automáticamente las babosas basado en otro campo de su modelo, si así lo desea.

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 se entiende la idea:)

Me (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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top