2015-01-11 5 views
0

저는 몇 시간 만에 막혀서이 문제를 해결할 수 없습니다.Django SlugField 고유하지 않음

다음 코드는 잘 작동하지만, 이미 존재는 "제목"을 작성하는 경우 내가 얻을 :

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

모델의 url_shop 필드에서 unique=True을 제거하고 데이터베이스를 python manage.py makemigrationspython manage.py migrate으로 업데이트하십시오. 당신이 그것을 사용하는 방법에 따라 앱 영향을 미칠 수있는 고유하지 않은 값을 가질 수 슬러그 필드 (두 개체 예를 들어 동일한 URL을 가진)

1

당신이 unique_slugify 사용할 수 있지만

는주의 슬러그가 이미 작성되어있는 경우 고유 슬러그가 발견 될 때까지, unique_slugify가 슬러그에 '-1'(그리고 위쪽으로)를 추가한다 존재하는 고유 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=True을 귀하의 url_shop 모델에 보관하십시오 :]

기존 코드에 문제가있는 이유는 기존 슬러그 값을 확인하지 않고 slugify은 제목 필드를 슬러그로 변환하기 위해서입니다. 위의 방법으로 unique_slugify은 기존 값을 확인하고 아직 db에없는 슬러그를 생성합니다.

+0

https://pypi.python.org/pypi/django-autoslug를 시도한 적은 없지만이 방법이 도움이 될 수도 있습니다. 나는 unique_slugify가 꽤 단순한 방법이라는 것을 보증 할 수있다. –

+0

도움이 되었다면 언제든지 답변으로 표시하십시오.) –

관련 문제