我被困了几个小时,我无法解决这个问题。
以下代码效果很好,但如果我写了一个已经存在的“标题”,我会得到:
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))
我该如何解决这个问题?
答案 0 :(得分:1)
从模型中的unique=True
字段中移除url_shop
,并使用python manage.py makemigrations
和python 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。