【问题标题】:Validating a field in Create Profile Form验证创建配置文件表单中的字段
【发布时间】:2016-06-16 16:38:02
【问题描述】:

我正在尝试在注册后构建一个创建配置文件表单,我的代码如下。它已经只为一个小问题工作,也就是说,如果Profile 模型的name 字段与数据库中的一个匹配,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'),]

谢谢

【问题讨论】:

    标签: python django


    【解决方案1】:

    ModelForms 实际上是validate uniqueness 作为is_valid() 检查的一部分。

    您的问题是您在运行is_valid() 后手动设置slug。因此,您必须在设置 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 这样的库来为您执行此逻辑。

    【讨论】:

    • 感谢它完美运行的洞察力。但是,如果我想确保名称是唯一的怎么办,所以它会引发“名称已存在”的验证错误消息。由于文档说 is_valid() 确保具有唯一 =true 的字段标签是字段,所以我尝试放置一个已经使用名称,同时使其在模型中唯一,但它会显示“...查看返回无”
    • 如果您希望名称是唯一的,那么您应该在模型字段定义中指定unique=True
    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多