Django admin - 在管理面板中进行表单验证

时间:2017-07-17 22:30:23

标签: django validation

我遇到表单验证问题。这是我的clean方法的一部分(forms.py - 类SiteAddFormFull(forms.ModelForm)):

url = self.cleaned_data['url']
if self.check_url_in_database(url) is True:
    errors.append('Url already exists')
if errors:
    raise forms.ValidationError(errors)
return self.cleaned_data

这是check_url_in_database方法:

def check_url_in_database(self, url1):
    if url1[7:10] == 'www':
        url = 'http://' + url1[11:]
    else:
        url = url1.replace('http://', 'http://www.')
    try:
        Site.objects.get(url=url1)
        return True
    except ObjectDoesNotExist:
        try:
            Site.objects.get(url=url)
            return True
        except ObjectDoesNotExist:
            return False

当我在我的django admin中创建新对象(Site)时,它工作正常(验证数据库中是否存在url)。当我尝试修改现有对象时出现问题。它会抛出相同的错误('Url已存在')。什么是仅验证新对象的正确方法?

1 个答案:

答案 0 :(得分:1)

在您的模型表单中,您可以访问self.instance.pk。如果主键存在,则将其从查询集中排除。

def check_url_in_database(self, url1):
    if url1[7:10] == 'www':
        url = 'http://' + url1[11:]
    else:
        url = url1.replace('http://', 'http://www.')
    sites = Site.objects.all()
    if self.instance.pk:
        sites = sites.objects.exclude(pk=self.instance.pk)
    try:
        sites.get(url=url1)
        return True
    except ObjectDoesNotExist:
        try:
            sites.get(url=url)
            return True
        except ObjectDoesNotExist:
            return False