这是一个简单的模型,其中一个字段是唯一的:

class UserProfile(models.Model):
    nickname = models.CharField(max_length=20, unique=True)
    surname = models.CharField(max_length=20)

View 允许用户使用 ModelForm 修改 的个人资料:
class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile

def my_profile(request):
    ...
    if request.method == 'GET':
        # Below, 'profile' is the profile of the current user
        profile_form = UserProfileForm(instance=profile)
    else:
        profile_form = UserProfileForm(request.POST)
        if profile_form.is_valid():
            ... # save the updated profile

    return render(request, 'my_profile.html', {'form': form})

问题是如果用户不更改其昵称,is_valid() 总是返回 False,因为唯一性检查。我需要唯一性检查,因为我不希望一个用户将其昵称设置为另一个用户,但它不应该阻止用户将其昵称设置为其当前昵称。

我是否必须重写表单的验证,还是我错过了一些更容易的东西?

最佳答案

您必须将实例传递给未绑定(bind)和绑定(bind)表单:

else:
    profile_form = UserProfileForm(request.POST, instance=profile)
    if profile_form.is_valid():
        ... # save the updated profile

这将确保更新当前用户的配置文件,而不是创建新的配置文件。

关于django - 使用 unique=True 字段验证 ModelForm,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23618794/

10-12 16:38