验证“创建配置文件表单”中的字段

时间:2016-06-16 16:38:02

标签: python django

我正在尝试在注册后创建一个创建配置文件表单,我的代码在下面。它已经只用于一个小问题,也就是说,如果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'),]

由于

1 个答案:

答案 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这样的库来为你执行这个逻辑。