标签: django-validation

为什么django的model.save()不调用full_clean()?

我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.

请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档

(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)

有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.

我知道如何使一切正常工作,我只是在寻找解释.

python django django-models django-validation

141
推荐指数
3
解决办法
2万
查看次数

什么是在Django模型中存储电话号码的最佳方式

我正在存储这样的电话号码model:

phone_number = models.CharField(max_length=12)
Run Code Online (Sandbox Code Playgroud)

用户将输入电话号码,我将使用该电话号码.SMS Authentication此应用程序将在全球范围内使用.所以我还需要国家代码.是CharField存储电话号码的好方法?而且,我该如何验证电话号码?

提前致谢.

django django-forms django-validation

114
推荐指数
6
解决办法
9万
查看次数

自定义表单验证

我有一个非常简单的形式:

from django import forms

class InitialSignupForm(forms.Form):
    email = forms.EmailField()
    password = forms.CharField(max_length=255, widget = forms.PasswordInput)
    password_repeat = forms.CharField(max_length=255, widget = forms.PasswordInput)

    def clean_message(self):
        email = self.clean_data.get('email', '')
        password = self.clean_data.get('password', '')
        password_repeat = self.clean_data.get('password_repeat', '')

        try:
            User.objects.get(email_address = email)
            raise forms.ValidationError("Email taken.")
        except User.DoesNotExist:
            pass

        if password != password_repeat:
            raise forms.ValidationError("The passwords don't match.")
Run Code Online (Sandbox Code Playgroud)

这是自定义表单验证的方式吗?我需要评估一下email,目前没有用户使用该电子邮件地址.我还需要评估passwordpassword_repeat匹配.我该怎么做呢?

django django-forms django-validation

42
推荐指数
1
解决办法
5万
查看次数

Django管理员中的自定义验证

我有一个非常简单的Django应用程序,以记录给我的同事的讲座.由于它是相当基本的,我使用Django管理员本身.这是我的models.py:

#models.py
from django.db import models

class Lecture(models.Model):
    topic = models.CharField(max_length=100)
    speaker = models.CharField(max_length=100)
    start_date = models.DateField()
    end_date = models.DateField()
Run Code Online (Sandbox Code Playgroud)

我需要确保没有人在管理表单中的结束日期之后输入开始日期,所以我在管理员中阅读了django文档以进行自定义验证,并在我的admin.py中实现了以下内容:

#admin.py
from models import Lecture
from django.contrib import admin
from django import forms


class LectureForm(forms.ModelForm):
    class Meta:
        model = Lecture

        def clean(self):
            start_date = self.cleaned_data.get('start_date')
            end_date = self.cleaned_data.get('end_date')
            if start_date > end_date:
                raise forms.ValidationError("Dates are incorrect")
        return self.cleaned_data


class LectureAdmin(admin.ModelAdmin):
    form = LectureForm
    list_display = ('topic', 'speaker', 'start_date', 'end_date')

admin.site.register(Lecture, LectureAdmin)
Run Code Online (Sandbox Code Playgroud)

但是,这对我的管理员没有任何影响,我可以保存讲座,其中start_date位于end_date之后,如图所示:在此输入图像描述

我究竟做错了什么 ??

python django django-forms django-admin django-validation

34
推荐指数
2
解决办法
2万
查看次数

在django中调用create时是否隐式调用save()?

我正在尝试对模型执行一些自定义验证,我感到困惑.让我具体一点.假设我的代码如下:

class FooManager(models.Manager):
  def create_foo(self, name):
    return self.create(foo_name = name)

class Foo(models.Model):
  foo_name = models.CharField(max_length=30)
  objects = FooManager()

  def clean(self):
    ...
  def save(self, *args, **kwargs):
    self.full_clean()
    super(User, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

现在,当我从shell使用这个模型时,如果我打电话:

f = Foo.objects.create_foo("")

在我有机会在f上调用save()之前,它会引发验证错误.为什么会这样?一旦调用f.save(),是否应该仅提出验证错误?

注意:如果我使用objects.create()而不是自定义的create方法,则会发生同样的事情.任何帮助将不胜感激,因为我发现django中的验证相当令人沮丧.

django django-models django-validation

32
推荐指数
2
解决办法
2万
查看次数

ModelForm的Django TextField max_length验证

在验证ModelForm时,Django不尊重TextField模型字段的max_length属性.

所以我定义了一个继承自models.TextField的LimitedTextField,并添加了类似于models.CharField的验证位:

from django.core import validators

class LimitedTextField(models.TextField):
    def __init__(self, *args, **kwargs):
        super(LimitedTextField, self).__init__(*args, **kwargs)
        self.max_length = kwargs.get('max_length')
        if self.max_length:
            self.validators.append(validators.MaxLengthValidator(self.max_length))

    def formfield(self, **kwargs):
        defaults = {'max_length': self.max_length}
        defaults.update(kwargs)
        return super(LimitedTextField, self).formfield(**defaults)
Run Code Online (Sandbox Code Playgroud)

但这对ModelForm验证仍然没有影响.

我错过了什么?任何帮助深表感谢.

谢谢,

OMAT

django django-models django-forms django-validation

28
推荐指数
2
解决办法
3万
查看次数

Django unique_together与可空的ForeignKey

我在使用Sqlite的开发机器中使用Django 1.8.4并且我有这些模型:

class ModelA(Model):
    field_a = CharField(verbose_name='a', max_length=20)
    field_b = CharField(verbose_name='b', max_length=20)

    class Meta:
        unique_together = ('field_a', 'field_b',)


class ModelB(Model):
    field_c = CharField(verbose_name='c', max_length=20)
    field_d = ForeignKey(ModelA, verbose_name='d', null=True, blank=True)

    class Meta:
        unique_together = ('field_c', 'field_d',)
Run Code Online (Sandbox Code Playgroud)

我已经运行了正确的迁移并在Django Admin中注册了它们.所以,使用Admin我做过这个测试:

  • 我能够创建ModelA记录,Django禁止我创建重复记录 - 正如预期的那样!
  • 当field_b不为空时,我无法创建相同的ModelB记录
  • 但是,当使用field_d为空时,我能够创建相同的ModelB记录

我的问题是:如何将unique_together应用于可空的ForeignKey?

我发现这个问题的最新答案有5年......我确实认为Django已经进化了,问题可能不一样.

django django-models django-forms django-validation

18
推荐指数
3
解决办法
6328
查看次数

Django - 形成Clean()和字段错误

我正在尝试在表单clean()中设置字段错误,我现在正在做:

self._errors['address'] = self._errors.get('address', ErrorList())
self._errors['address'].append(_(u'Please specify an address.'))
Run Code Online (Sandbox Code Playgroud)

这样做有更好的,如果可能的更短的方法吗?

django validation django-forms django-validation

13
推荐指数
3
解决办法
1万
查看次数

在django中验证错误时将css类添加到字段

我正在使用Django的模型并且非常好.如果存在与之关联的验证错误,如何突出显示实际文本框(例如border:red).基本上我想要的是在字段存在验证错误时添加类(错误).

python django django-forms django-validation django-media

12
推荐指数
2
解决办法
1万
查看次数

Model和Admin中的Django字段验证?

我想为Django模型的特定字段定义自己的验证例程.我希望错误消息显示在管理表单中,但如果实体是由自己的python代码保存,我也希望进行相同的验证.有没有办法在不违反DRY原则的情况下做到这一点?

django django-models django-admin django-validation

10
推荐指数
1
解决办法
6162
查看次数