I want to display error whenever user try to create object with the same name. I want firm name to be unique. Tried but issue remains. Django should display error in the form but why I am getting this.????
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
)
But instead I am getting this.
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
View:
class CreateFirmView(LoginRequiredMixin, CreateView):
form_class = CreateFirmForm
http_method_names = ['get', 'post']
success_url = reverse_lazy('girvi:find_customer')
template_name = 'create_templates/create_firm.html'
def form_valid(self, form):
from django.shortcuts import HttpResponse
super(CreateFirmView, self).form_valid(form)
return HttpResponse(
'''
<script>
window.close();
window.onunload = refreshParent; function refreshParent() {
window.opener.location.reload();
}
</script>
'''
)
Form:
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.'}
)
}
SQL :
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)
This error is thrown by database.
But django ModelForm will process unique costraint automatically.
Just don't forget to call clean()
method of the parent form:
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()
As it written in django docs :
The ModelForm.clean() method sets a flag that makes the model validation step validate the uniqueness of model fields that are marked as unique, unique_together or unique_for_date|month|year.
If you would like to override the clean() method and maintain this validation, you must call the parent class's clean() method.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.