Question

Je travaille actuellement sur un projet de jouet dans Django.

Une partie de mon application permet aux utilisateurs de laisser de commentaires. Je voudrais prendre le titre de l'examen et slugify pour créer une URL.

Ainsi, si un utilisateur écrit un examen appelé « ! La meilleure chose jamais », l'URL serait quelque chose comme: www.example.com/reviews/the-best-thing-ever.

C'est bien beau, mais quelle est la meilleure façon de gérer le cas où deux utilisateurs de choisir le même titre? Je ne veux pas faire le titre requis pour être unique.

J'ai pensé à ajouter l'ID d'examen dans l'url quelque part, mais je voudrais éviter que les informations supplémentaires pour toutes les urls qui n'entrent pas en collision.

Toutes les idées?

Était-ce utile?

La solution

Une chose que je ne ai jamais aimé sur les champs / méthodes de limaces uniques est que si vous avez beaucoup d'affrontements pour un seul titre, vous allez finir par l'exécution de plusieurs requêtes pour tenter de déterminer une limace disponible. Je sais que vous avez mentionné que vous ne voulez pas montrer l'id pour les limaces non discordantes, mais, pour autant que la performance, je pense qu'il est le meilleur itinéraire à prendre. Pour l'URL un peu plus agréable à la recherche, je préfère aussi incorporer l'id avant la limace, de sorte qu'une URL prend la forme d'www.example.com/reviews/1/the-best-thing-ever.

Autres conseils

Je recommande quelque chose comme AutoSlugField . Il a quelques options disponibles en ce qui concerne la configuration de l'unicité (unique et unique_with), et a l'avantage supplémentaire d'être en mesure de générer automatiquement les limaces basé sur un autre champ de votre modèle, si vous le souhaitez.

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

bien sûr changer les noms appropriés et la définition de la forme, mais vous voyez l'idée:)

Je (dans la validation du formulaire) il suffit de vérifier pour voir si la limace est utilisé, puis ajouter quelque chose, soit un nombre « ma-cool-idea_2 » ou l'identifiant réelle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top