Django SlugField并不是唯一的

时间:2015-01-11 20:50:19

标签: django

我被困了几个小时,我无法解决这个问题。

以下代码效果很好,但如果我写了一个已经存在的“标题”,我会得到:

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)) 

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

从模型中的unique=True字段中移除url_shop,并使用python manage.py makemigrationspython manage.py migrate更新您的数据库。

请注意,虽然可以具有非唯一值的slug字段可能会对您的应用产生影响,具体取决于您使用它的方式(例如,两个具有相同网址的对象)

答案 1 :(得分: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)

如果创建的slug已经存在,unique_slugify将附加' -1' (并且向上)到slug,直到找到一个独特的slu ..将unique=True保留在url_shop模型中:kwargs:]

您现有代码存在问题的原因是slugify仅将标题字段转换为slug,而不是检查现有的slug值。使用上面的方法,unique_slugify将检查现有值并生成db中尚不存在的slug。