Django唯一约束不起作用
我想在用户尝试创建同名对象时显示错误。我希望公司名称是唯一的。但问题依然存在。Django应该在表单中显示错误,但为什么我会得到这个Django唯一约束不起作用,django,django-models,django-forms,Django,Django Models,Django Forms,我想在用户尝试创建同名对象时显示错误。我希望公司名称是唯一的。但问题依然存在。Django应该在表单中显示错误,但为什么我会得到这个 Firm model: class Firm(models.Model): name = models.TextField( verbose_name='firm name', max_length=100, unique=True ) address = models.TextField(
Firm model:
class Firm(models.Model):
name = models.TextField(
verbose_name='firm name',
max_length=100, unique=True
)
address = models.TextField(
max_length=100
)
phone_no_1 = models.CharField(
max_length=10, null=True, blank=True
)
phone_no_2 = models.CharField(
max_length=10, null=True, blank=True
)
reg_no = models.TextField(
max_length=25, null=True, blank=True
)
但我得到的却是这个
Traceback:
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\core\handlers\base.py" in get_response
111. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\views\generic\base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\utils\decorators.py" in _wrapper
29. return bound_func(*args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\utils\decorators.py" in bound_func
25. return func.__get__(self, type(self))(*args2, **kwargs2)
File "C:\Users\PrImE\workspace\kaizentech\egirvi\dev\egirvi\girvi\utils.py" in dispatch
14. return super(LoginRequiredMixin, self).dispatch(*args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\views\generic\base.py" in dispatch
87. return handler(request, *args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\views\generic\edit.py" in post
207. return super(BaseCreateView, self).post(request, *args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\views\generic\edit.py" in post
173. return self.form_valid(form)
File "C:\Users\PrImE\workspace\kaizentech\egirvi\dev\egirvi\girvi\views\create_views\create_firm_view.py" in form_valid
16. super(CreateFirmView, self).form_valid(form)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\views\generic\edit.py" in form_valid
149. self.object = form.save()
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\forms\models.py" in save
457. construct=False)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\forms\models.py" in save_instance
103. instance.save()
File "C:\Users\PrImE\workspace\kaizentech\egirvi\dev\egirvi\girvi\models\firm.py" in save
29. return super(Firm, self).save(*args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\base.py" in save
590. force_update=force_update, update_fields=update_fields)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\base.py" in save_base
618. updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\base.py" in _save_table
699. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\base.py" in _do_insert
732. using=using, raw=raw)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\manager.py" in manager_method
92. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\query.py" in _insert
921. return query.get_compiler(using=using).execute_sql(return_id)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\models\sql\compiler.py" in execute_sql
920. cursor.execute(sql, params)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\backends\utils.py" in execute
81. return super(CursorDebugWrapper, self).execute(sql, params)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\backends\utils.py" in execute
65. return self.cursor.execute(sql, params)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\utils.py" in __exit__
94. six.reraise(dj_exc_type, dj_exc_value, traceback)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\backends\utils.py" in execute
65. return self.cursor.execute(sql, params)
File "C:\Users\PrImE\envs\kaizentech\lib\site-packages\django\db\backends\sqlite3\base.py" in execute
485. return Database.Cursor.execute(self, query, params)
Exception Type: IntegrityError at /add_firm/
Exception Value: column name is not unique
视图:
SQL:
此错误由数据库引发 但django ModelForm将自动处理唯一的costraint 只是别忘了调用父窗体的clean方法:
from django import forms
class FirmForm(forms.ModelForm):
class Meta:
model = Firm
def clean(self):
# do some your stuff here
# don't forget to call super().clean
return super(FirmForm, self).clean()
正如书中所写:
ModelForm.clean方法设置一个标志,使模型验证步骤验证标记为unique、unique_或unique_for_date | month | year的模型字段的唯一性。
如果要重写clean方法并维护此验证,则必须调用父类的clean方法
我有另一个具有类似唯一约束的模型。每当用户试图输入重复条目时,django就会显示这个错误名称:具有这个名称的Caste已经存在。。但企业模式并非如此。我做错了什么?????尝试重新创建db,但问题仍然存在。Checked SQL unique约束在数据库级别应用,但得到相同的错误。虽然django应该在表单上显示错误,但它不是。为什么?有人能帮我吗。更新代码。看一看,我刚刚删除了唯一约束,错误消失了。但是为什么我不能使此字段唯一。??只是尝试为名称字段输入重复的名称,并获得预期的错误,因为此公司名称已存在。但为什么它不符合我的观点呢。我的代码有问题对不起,忘了,django会自动处理唯一约束。更新了答案。您的唯一约束已应用于数据库,您将获得数据库错误。问题是为什么django不能自动检查唯一性,你实际上是在调用clean吗?
class CreateFirmForm(forms.ModelForm):
from girvi.utils import validators
phone_no_1 = forms.CharField(
label='Phone No. 1', required=False, validators=[
validators.get('only_numbers'), validators.get('min_value')(10)
],
widget=forms.TextInput(
attrs={'placeholder': 'Mobile Number', 'class': 'form-control'}
)
)
phone_no_2 = forms.CharField(
label='Phone No. 2 ', required=False, validators=[
validators.get('only_numbers'), validators.get('max_value')(10), validators.get('max_value')(10)
],
widget=forms.TextInput(
attrs={'placeholder': 'Mobile Number', 'class': 'form-control'}
)
)
class Meta:
model = Firm
fields = '__all__'
widgets = {
'name': forms.TextInput(
attrs={'autofocus': 'true', 'class': 'form-control', 'placeholder': 'Firm Name'}
),
'address': forms.TextInput(
attrs={'class': 'form-control', 'placeholder': 'Address'}
),
'reg_no': forms.TextInput(
attrs={'class': 'form-control', 'placeholder': 'Reg No.'}
)
}
CREATE TABLE "girvi_firm" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(100) NOT NULL UNIQUE, "address" text NOT NULL, "phone_no_1" varchar(10) NULL, "phone_no_2" varchar(10) NULL, "reg_no" text NULL)
from django import forms
class FirmForm(forms.ModelForm):
class Meta:
model = Firm
def clean(self):
# do some your stuff here
# don't forget to call super().clean
return super(FirmForm, self).clean()