簡體   English   中英

Django表單驗證錯誤?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM