2015-01-11 2 views
0

Я застрял пару часов, и я не могу решить эту проблему.Django SlugField не уникален

Следующий код работает хорошо, но если я пишу "Title", которые уже существуют, я получаю:

UNIQUE constraint failed: appname_shopaccount.url_shop 

Модель

class ShopAccount(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=150) 
    url_shop = models.SlugField(max_length=200, unique=True) 
    company_name = models.CharField(max_length=200) 

    def save(self, *args, **kwargs): 
     self.url_shop = slugify(self.title) 
     super(ShopAccount, self).save(*args, **kwargs)  

    def __str__(self): 
     return self.title 

Формы

class SignUpShopForm(ModelForm): 

    class Meta: 
     model = ShopAccount 
     fields=['title', 'company_name']   
     exclude= ('user',) 

     error_messages = { 
      'title': { 
       'required': "Enter a Shop name", 
      },          
      'company_name': { 
       'required': "Enter a Company name", 
      } 
     } 

Посмотреть

def signup_shop(request):  
    if request.POST: 
     form = SignUpShopForm(request.POST) 
     if form.is_valid(): 
      account = form.save(commit=False) 
      account.user = request.user 
      account.save() 
      return HttpResponseRedirect('/account/updated/') 
     else: 
      form = SignUpShopForm(data=request.POST) 
      return render_to_response('register_shop.html', { 'form':form }, context_instance=RequestContext(request)) 
    else:   
     return render_to_response('register_shop.html', context_instance=RequestContext(request)) 

Как я могу решить эту проблему?

ответ

1

Удалить unique=True с поля url_shop в вашей модели и обновите базу данных python manage.py makemigrations и python manage.py migrate.

Имейте в виду, однако, что поле слизняк, который может иметь не уникальные значения может иметь последствия для вашего приложения в зависимости от того, как вы используете его (два объекта, имеющих один и тот же URL, например)

1

Вы можете использовать unique_slugify для заставить уникальную slug- https://djangosnippets.org/snippets/690/

import unique_slugify 

class ShopAccount(models.Model): 
    ... 
    def save(self, *args, **kwargs): 
     self.url_shop = unique_slugify(self, self.title, slug_field_name='url_shop') 
     super(ShopAccount, self).save(*args, **kwargs) 

Если пробкового создаются уже существует, unique_slugify добавляет символ «-1» (и выше) на слизняк, пока уникальный пробковый не найден. Держите unique=True в вашей модели url_shop kwargs:]

Причина, по которой у вас возникла проблема с вашим существующим кодом, заключается в том, что slugify преобразует поле заголовка в пул, не проверяя существующие значения слизней. С помощью вышеописанного метода unique_slugify проверит существующие значения и сформирует пул, который еще не существует в db.

+0

Это также может сработать для вас, хотя я никогда не пробовал - https://pypi.python.org/pypi/django-autoslug. Я могу поручиться за уникальный_slugify, являющийся простым методом простого dang. –

+0

Если это вам помогло, не стесняйтесь отмечать это как ответ;) –

Смежные вопросы