Волшебный uniPaas: используемый это в моем самом первом задании, которое разработает GUI. Это не ерунда Инструмент RAD, где все - базирующаяся таблица. Это также обеспечивает среду выполнения. Тогда это назвали Волшебным eDeveloper.
Одна вещь, которая мне никогда не нравилась в уникальных полях / методах слагов, - это то, что если у вас много конфликтов для одного заголовка, вы ' Я выполню несколько запросов, чтобы попытаться определить доступный слаг. Я знаю, что вы упомянули, что не хотите показывать идентификатор для неконфликтующих пулов, но, что касается производительности, я думаю, что это лучший путь. Чтобы URL-адрес выглядел немного лучше, я предпочитаю также встраивать идентификатор перед слагом, чтобы URL-адрес имел форму www.example.com/reviews/1/the-best-thing-ever.
Я бы порекомендовал что-то вроде AutoSlugField . У него есть несколько доступных опций в отношении настройки уникальности ( unique
и unique_with
), а также есть дополнительное преимущество, заключающееся в возможности автоматического создания заголовков на основе другого поля вашей модели, если вы так выбираете.
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 :)
Я бы (при валидации формы) просто проверил, используется ли slug, а затем добавил бы к нему что-нибудь, либо число "my-cool-idea_2", либо фактический id