2014-12-30 3 views
1

У меня проблема с созданием уникальных слизней с использованием моделей django. Я хочу, чтобы администратор мог изменить slug с страницы редактирования в admin. Когда slug уже существует, должно быть «slug + _1», «slug + _2» и т. Д. Также, когда создается новая страница и нет пули, если slug должен быть заголовком страницы. У меня есть этот код, но по какой-то причине администратор продолжает говорить: «Страница с этим Slug уже существует». когда я добавляю страницу с уже запущенным слизью. Надеюсь, кто-нибудь может мне помочьсоздать уникальный slug django

def save(self, *args, **kwargs): 
    if not self.id and not self.slug: 
     self.slug = slugify(self.page_title) 

    else: 
     self.slug = slugify(self.slug) 

    slug_exists = True 
    counter = 1 
    slug = self.slug 
    while slug_exists: 
     try: 
      slug_exits = Page.objects.get(slug=slug) 
      if slug_exits == slug: 
       slug = self.slug + '_' + str(counter) 
       counter += 1 
     except: 
      self.slug = slug 
      break 
    super(Page, self).save(*args, **kwargs) 
+0

Вы хотите написать 'self.slug = self.slug + '_' + str (counter)' вместо 'slug = self.slug + '_' + str (counter)'? – xnx

+0

Нет перезаписывания var 'slug', чтобы он мог искать page_1 или page_2 и т. Д. Когда он не найден, исключение должно давать' self.slug' пулю. –

+1

Это не точный ответ на ваш вопрос, но, возможно, стоит обратить внимание: https://pypi.python.org/pypi/django-autoslug –

ответ

3

Попробуйте это. Не проверял сам. Но это должно дать вам эту идею.

import re 
def save(self, *args, **kwargs): 
    if not self.id: # Create 
     if not self.slug: # slug is blank 
      self.slug = slugify(self.page_title) 
     else: # slug is not blank 
      self.slug = slugify(self.slug) 
    else: # Update 
     self.slug = slugify(self.slug) 

    qsSimilarName = Page.objects.filter(slug__startswith='self.slug') 

    if qsSimilarName.count() > 0: 
     seqs = [] 
     for qs in qsSimilarName: 
      seq = re.findall(r'{0:s}_(\d+)'.format(self.slug), qs.slug) 
      if seq: seqs.append(int(seq[0])) 

     if seqs: self.slug = '{0:s}_{1:d}'.format(self.slug, max(seqs)+1) 

    super(Page, self).save(*args, **kwargs) 

Три проблемы в вашем коде.

  1. Первая else означает либо self.id или self.slug не является пустым. Поэтому, если self.id НЕ ЗАПУСКА и self.slug пусто, self.slug не получит значение.
  2. slug_exits == slug всегда будет False, потому что slug_exits - объект модели, а slug - это строка. Вот почему вы получаете сообщение об ошибке!
  3. Вы сделали запрос в цикле, что может вызвать множество обращений к БД.
Смежные вопросы