【问题标题】:Django Form Validation Error?Django 表单验证错误?
【发布时间】:2017-04-15 05:15:46
【问题描述】:

我正在尝试运行和验证表单,但遇到了一些问题。它不显示表单,而是呈现我在表单无效时显示的模板。

这是我的模型

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 不会显示任何错误。

感谢所有帮助/建议。

【问题讨论】:

  • 请显示tutors.html
  • @nik_m 现在它只包含

    ERROR!!

标签: python django validation django-models django-forms


【解决方案1】:

[编辑]:你得到的验证错误解释得很好here。为了使其工作,您应该再添加 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>

但这不会单独工作。您必须将form 变量从pref2 视图传递到您的模板(以便填充{{ form }})。

改为:

return render(request, 'website/tutors.html', locals())

还有,

prefer = form.save(commit=False)
prefer.save()

是多余的。由于这两行之间没有数据操作(即您没有以某种方式修改prefer 表单),您可以将其设为一个,如下所示:

prefer = form.save()

【讨论】:

  • 我将“return render(request, 'website/tutors.html')”更改为“return HttpResponse('Some Problem')。所以它现在显示'Some problem'而不是显示表单。
  • 没有。你不应该做出这样的改变。您应该将return render(request, 'website/tutors.html') 更改为return render(request, 'website/tutors.html', locals())
  • 在将其更改为“return render(request, 'website/pref2.html', {'form': form})”时,它会显示表单,但不会将数据保存在数据库中并显示“谢谢”您点击提交时会再次显示表单。
  • 控制台是否打印了任何错误(print(form.errors) 的原因)?
  • 对于我将小部件设置为 forms.CheckboxSelectMultiple() 的模型,它显示错误“选择一个有效的选择。['M'] 不是可用的选择之一。 ”。将其更改为 Radioselect() 问题得到解决。但我想显示复选框。
猜你喜欢
  • 2016-03-20
  • 2011-02-21
  • 1970-01-01
  • 2011-01-03
  • 2013-04-01
  • 1970-01-01
  • 2015-03-14
  • 2011-02-01
  • 2014-12-01
相关资源
最近更新 更多