rom*_*rom 5 forms django validation django-errors
我的 django 表单集中有验证错误。从数据库填充的两个下拉列表没有通过验证,我不明白我的错误是什么。
型号:
class Country(models.Model):
country_code=models.CharField(max_length=2, primary_key=True)
country=models.CharField(max_length=20, unique=True)
def __unicode__(self):
return u"%s" % self.country
class Status(models.Model):
verbatim = models.ForeignKey(Verbatim)
country = models.ForeignKey(Country)
status = models.CharField(max_length=5, db_index=True)
def __unicode__(self):
return u"%s" % self.status
class Meta:
unique_together=(("verbatim", "country"), )
class ImportMinAttend(models.Model):
country=models.CharField(max_length=2, blank=False, null=False)
verbatim=models.CharField(max_length=250, blank=False, null=False)
status=models.CharField(max_length=5, blank=True, null=True, default=None)
Run Code Online (Sandbox Code Playgroud)
形式:
class MinAttendForm(forms.ModelForm):
country=forms.ModelChoiceField(queryset=Country.objects.all(), empty_label="Select a country")
status=forms.ModelChoiceField(queryset=Status.objects.values_list('status', flat = True).distinct(), empty_label="Select a status")
class Meta:
model=ImportMinAttend
#fields used for the validation
fields = ('country', 'verbatim', 'status')
Run Code Online (Sandbox Code Playgroud)
观点:
class MinAttendUpdate(UpdateView):
model = ImportMinAttend
fields = ['country', 'verbatim', 'status']
form_class=MinAttendForm
def post(self, request, *args, **kwargs):
...
MinAttendFormSet = modelformset_factory(self.model, form=self.form_class, fields=self.fields, extra=len(attendances), max_num=len(attendances)+self.nb_extra_forms)
formset=MinAttendFormSet(request.POST, queryset=attendances)
...
Run Code Online (Sandbox Code Playgroud)
第一个国家选择的源代码:
<select name="form-0-country" id="id_form-0-country">
<option value="">Select a country</option>
<option value="AT" selected="selected">Austria</option>
<option value="BE">Belgium</option>
<option value="BG">Bulgaria</option>
...
Run Code Online (Sandbox Code Playgroud)
第一个状态选择的源代码:
<select name="form-0-status" id="id_form-0-status">
<option value="">Select a status</option>
<option value="AB">AB</option>
<option value="CS">CS</option>
<option value="M" selected="selected">M</option>
</select>
Run Code Online (Sandbox Code Playgroud)
关于国家选择:显示的值有两个以上的字符,但使用的键正好有 2 个字符。为什么这个验证错误?关于状态,我什至不明白问题...
非常感谢。
我找到了“肮脏”的解决方法。对于国家选择,我使用选择的键,而不是值:
def clean_country(self):
data = self.cleaned_data['country'].pk
return data
Run Code Online (Sandbox Code Playgroud)
对于状态选择,如果选择了一个值,我会删除验证错误:
def clean(self):
#call status clean method
self.cleaned_data["status"]=self.clean_status()
return self.cleaned_data
def clean_status(self):
#valid if a value has been selected
if self["status"].value()!="":
del self._errors["status"]
return self["status"].value()
Run Code Online (Sandbox Code Playgroud)
它有效,但为什么我必须这样做?:(
我认为你正在以艰难的方式做到这一点。有更简单的方法可以做到这一点,即利用 ModelForm。这是一个完整的例子。阅读它并根据您的模型进行调整:
from django.db import models
from django.forms import ModelForm
TITLE_CHOICES = (
('MR', 'Mr.'),
('MRS', 'Mrs.'),
('MS', 'Ms.'),
)
class Author(models.Model):
name = models.CharField(max_length=100)
title = models.CharField(max_length=3, choices=TITLE_CHOICES)
birth_date = models.DateField(blank=True, null=True)
def __str__(self): # __unicode__ on Python 2
return self.name
class Book(models.Model):
name = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ['name', 'title', 'birth_date']
class BookForm(ModelForm):
class Meta:
model = Book
fields = ['name', 'authors']
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2402 次 |
最近记录: |