我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.
请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档
(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)
有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.
我知道如何使一切正常工作,我只是在寻找解释.
我正在存储这样的电话号码model:
phone_number = models.CharField(max_length=12)
Run Code Online (Sandbox Code Playgroud)
用户将输入电话号码,我将使用该电话号码.SMS Authentication此应用程序将在全球范围内使用.所以我还需要国家代码.是CharField存储电话号码的好方法?而且,我该如何验证电话号码?
提前致谢.
我有一个非常简单的形式:
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,目前没有用户使用该电子邮件地址.我还需要评估password并password_repeat匹配.我该怎么做呢?
我有一个非常简单的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之后,如图所示:
我究竟做错了什么 ??
我正在尝试对模型执行一些自定义验证,我感到困惑.让我具体一点.假设我的代码如下:
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中的验证相当令人沮丧.
在验证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
我在使用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我做过这个测试:
我的问题是:如何将unique_together应用于可空的ForeignKey?
我发现这个问题的最新答案有5年......我确实认为Django已经进化了,问题可能不一样.
我正在尝试在表单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的模型并且非常好.如果存在与之关联的验证错误,如何突出显示实际文本框(例如border:red).基本上我想要的是在字段存在验证错误时添加类(错误).
我想为Django模型的特定字段定义自己的验证例程.我希望错误消息显示在管理表单中,但如果实体是由自己的python代码保存,我也希望进行相同的验证.有没有办法在不违反DRY原则的情况下做到这一点?