我正在尝试在注册后创建一个创建配置文件表单,我的代码在下面。它已经只用于一个小问题,也就是说,如果name
模型的Profile
字段匹配一个数据库,django带来一条错误消息column slug is not unique
。我看到slug字段与另一个有冲突,如果提交的名称与db中的一个类似,我将如何编辑以下代码以引发验证错误消息?
models.py
from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
name= models.CharField(max_length=10)
description=models.TextField()
slug=models.SlugField(unique=True)
user = models.OneToOneField(User, blank=True, null=True)
def __str__(self):
return self.name
views.py
def create_profile(request):
form_class = ProfileForm
if request.method == 'POST':
form = form_class(request.POST)
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.slug = slugify(profile.name)
profile.save()
slug = slugify(profile.name)
return redirect('profile_details', slug=profile.slug)
else:
form = form_class()
return render(request, 'profile/create_profile.html', {'form': form,})
urls.py
urlpatterns=[url(r'^accounts/create_profile/$',views.create_profile,name='registration_create_profile'),]
由于
答案 0 :(得分:0)
ModelForm
实际上validate uniqueness作为is_valid()
检查的一部分。
您的问题是您在运行slug
后手动设置is_valid()
。因此,您必须在设置slug后手动验证唯一性。像这样的东西会起作用:
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.slug = slug = slugify(profile.name)
# Check slug uniqueness, keep appending a digit until it fits
n = 1
while Profile.objects.filter(slug=profile.slug).exists():
# Need to find a new slug.
profile.slug = '%s-%d' % (slug, n)
n += 1
profile.save()
return redirect('profile_details', slug=profile.slug)
请注意,在模型的save()
方法中而不是在视图中执行此唯一性检查可能更好 - 这只是说明逻辑。
或者你可以使用像django-autoslug这样的库来为你执行这个逻辑。