[英]Django Form Validation Error?
我正在嘗試運行和驗證表單,但遇到了一些問題。 代替顯示表單,它呈現的是我在表單無效時顯示的模板。
這是我的模特 :
class Preference(models.Model):
CLASS_CHOICES = [('1', '1'), ('2', '2'), ('3', '3')]
BOARD_CHOICES = [('C', 'CBSE'), ('I', 'ICSE'), ('S', 'State Board')]
SLOT_CHOICES = [('M', 'Morning'), ('A', 'AfterNoon'), ('E', 'Evening')]
SUBJECT_CHOICES = [('H', 'HINDI'), ('M', 'MATH'), ('E', 'ENGLISH')]
LOCATION_CHOICES = [('M', 'My Home'), ('T', 'I am willing to travel')]
GENDER_CHOICES = [('M', 'Male'), ('F', 'Female'), ('B', 'Both are Fine')]
Class = models.CharField(max_length=2, choices=CLASS_CHOICES, default='1', blank=False)
Board = models.CharField(max_length=2, choices=BOARD_CHOICES, default='C', blank=False)
Subject = models.CharField(max_length=2, choices=SUBJECT_CHOICES, default='M', blank=False)
Frequency = models.IntegerField(default=7)
Slot = models.CharField(max_length=2, choices=SLOT_CHOICES, default='E', blank=False)
Location = models.CharField(max_length=2, choices=LOCATION_CHOICES, default='M', blank=False)
Gender = models.CharField(max_length=2, choices=GENDER_CHOICES, default='M', blank=False)
Address = models.CharField(max_length=250, blank=True)
Travel = models.IntegerField(default=5)
Name = models.CharField(max_length=50, blank=True)
Contact = models.IntegerField(default=100)
這是我的表格 :
class PreferenceForm(forms.ModelForm):
class Meta:
model = Preference
fields = ['Class', 'Board', 'Subject', 'Frequency', 'Slot', 'Location', 'Gender', 'Address',
'Travel', 'Name', 'Contact']
widgets = {
'Board': forms.RadioSelect(),
'Subject': forms.CheckboxSelectMultiple(),
'Slot': forms.CheckboxSelectMultiple(),
'Location': forms.CheckboxSelectMultiple(),
'Gender': forms.RadioSelect()}
這是我的看法 :
def pref2(request):
form = PreferenceForm(request.POST or None)
if form.is_valid():
prefer = form.save(commit=False)
prefer.save()
return HttpResponse('Thank You!')
else:
print(form.errors)
return render(request, 'website/tutors.html')
當我運行該應用程序時,它會呈現“ tutors.html”模板,而不顯示表單,並且form.errors
顯示任何錯誤。
感謝所有的幫助/建議。
[編輯]: 此處會很好地說明您收到的驗證錯誤。 為了使其工作,您應該再添加3個模型:
class Subject(models.Model):
SUBJECT_CHOICES = [('H', 'HINDI'), ('M', 'MATH'), ('E', 'ENGLISH')]
name = models.CharField(max_length=2, choices=SUBJECT_CHOICES, default='M', blank=False)
def __str__(self):
return self.name
class Slot(models.Model):
SLOT_CHOICES = [('M', 'Morning'), ('A', 'AfterNoon'), ('E', 'Evening')]
name = models.CharField(max_length=2, choices=SLOT_CHOICES, default='E', blank=False)
def __str__(self):
return self.name
class Location(models.Model):
LOCATION_CHOICES = [('M', 'My Home'), ('T', 'I am willing to travel')]
name = models.CharField(max_length=2, choices=LOCATION_CHOICES, default='M', blank=False)
def __str__(self):
return self.name
現在,在您的Preference
模型中,將其更改為:
class Preference(models.Model):
CLASS_CHOICES = [('1', '1'), ('2', '2'), ('3', '3')]
BOARD_CHOICES = [('C', 'CBSE'), ('I', 'ICSE'), ('S', 'State Board')]
GENDER_CHOICES = [('M', 'Male'), ('F', 'Female'), ('B', 'Both are Fine')]
Class = models.CharField(max_length=2, choices=CLASS_CHOICES, default='1', blank=False)
Board = models.CharField(max_length=2, choices=BOARD_CHOICES, default='C', blank=False)
subjects = models.ManyToManyField(Subject)
Frequency = models.IntegerField(default=7)
slots = models.ManyToManyField(Slot)
locations = models.ManyToManyField(Location)
Gender = models.CharField(max_length=2, choices=GENDER_CHOICES, default='M', blank=False)
Address = models.CharField(max_length=250, blank=True)
Travel = models.IntegerField(default=5)
Name = models.CharField(max_length=50, blank=True)
Contact = models.IntegerField(default=100)
另外,請將您的字段重命名為小寫(用address
代替Address
)。 首字母大寫用於類名。 之后,運行./manage.py makemigrations
和./manage.py migrate
應用更改。
[結束編輯]
看來您沒有在tutors.html
模板中顯示表單。 也就是說,您沒有利用剛剛創建的PreferenceForm
類。
因此,在tutors.html
,編寫以下代碼:
<form method="post">{% csrf_token %}
{{ form }}
<input type="submit" name="submit_preference">
</form>
但這不會單獨起作用。 您必須將pref2
視圖中的form
變量傳遞給模板(以便填充{{ form }}
)。
改成:
return render(request, 'website/tutors.html', locals())
另外,
prefer = form.save(commit=False)
prefer.save()
是多余的。 由於這兩行之間沒有數據操作(即您沒有以某種方式修改prefer
表單),因此可以將其設置為一個,如下所示:
prefer = form.save()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.