Django slugified URL - как обработать коллизии?

Волшебный uniPaas: используемый это в моем самом первом задании, которое разработает GUI. Это не ерунда Инструмент RAD, где все - базирующаяся таблица. Это также обеспечивает среду выполнения. Тогда это назвали Волшебным eDeveloper.

7
задан TM. 29 September 2009 в 04:23
поделиться

4 ответа

Одна вещь, которая мне никогда не нравилась в уникальных полях / методах слагов, - это то, что если у вас много конфликтов для одного заголовка, вы ' Я выполню несколько запросов, чтобы попытаться определить доступный слаг. Я знаю, что вы упомянули, что не хотите показывать идентификатор для неконфликтующих пулов, но, что касается производительности, я думаю, что это лучший путь. Чтобы URL-адрес выглядел немного лучше, я предпочитаю также встраивать идентификатор перед слагом, чтобы URL-адрес имел форму www.example.com/reviews/1/the-best-thing-ever.

6
ответ дан 6 December 2019 в 15:24
поделиться

Я бы порекомендовал что-то вроде AutoSlugField . У него есть несколько доступных опций в отношении настройки уникальности ( unique и unique_with ), а также есть дополнительное преимущество, заключающееся в возможности автоматического создания заголовков на основе другого поля вашей модели, если вы так выбираете.

6
ответ дан 6 December 2019 в 15:24
поделиться
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

of course change the appropriate names and form definition, but you get the idea :)

2
ответ дан 6 December 2019 в 15:24
поделиться

Я бы (при валидации формы) просто проверил, используется ли slug, а затем добавил бы к нему что-нибудь, либо число "my-cool-idea_2", либо фактический id

0
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: