添加IntegerField和Radio Widget之后,Django表单验证不起作用

问题描述:

我的表单设置正常并且没有任何错误,但是在添加了一个带有RadioSelect小部件的IntegerFIeld后,表单不再验证。 (在此之前,我只有模型中的CharFields,没有小工具)添加IntegerField和Radio Widget之后,Django表单验证不起作用

我已经搜索了其他类似的问题,但一直没能找到任何解决此问题的方法。

目前我只是不断收到我在views.py中编码的错误消息。

我的设立如下:

views.py

from django.shortcuts import render, get_object_or_404, redirect 
from django.contrib.auth.decorators import login_required 
from django.contrib import messages 
from django.utils import timezone 
from .forms import DiaryEntryForm 
from .models import DiaryEntry 

def new_entry(request): 
    if request.method == "POST": 
     form = DiaryEntryForm(request.POST) 
     if form.is_valid(): 
      entry = form.save(commit=False) 
      entry.author = request.user 
      entry.created_date = timezone.now() 
      entry.save() 
      messages.success(request, "Entry created successfully") 
      return redirect(entry_detail, entry.pk) 
     else: 
      messages.error(request, "There was an error saving your entry")    
      return render(request, 'diaryentryform.html', {'form': form}) 
    else: 
     form = DiaryEntryForm() 
     return render(request, 'diaryentryform.html', {'form': form}) 

forms.py

from django import forms 
from .models import DiaryEntry, FORM_CHOICES 


class DiaryEntryForm(forms.ModelForm): 
    body = forms.ChoiceField(widget=forms.RadioSelect(),choices=FORM_CHOICES) 
    mind = forms.ChoiceField(widget=forms.RadioSelect(),choices=FORM_CHOICES) 

    class Meta: 
     model = DiaryEntry   
     fields = ('body', 'mind', 'insights') 

models.py

from __future__ import unicode_literals 

from django.db import models 
from django.utils import timezone 
from django.conf import settings 
from django import forms 

# Create your models here. 

FORM_CHOICES = [ 
    ('very bad', 'very bad'), 
    ('bd', 'bad'), 
    ('OK', 'OK'), 
    ('good', 'good'), 
    ('very good', 'very good'), 
] 

class DiaryEntry(models.Model): 
    """ 
    Define the diary entry model here 
    """ 

    author = models.ForeignKey(settings.AUTH_USER_MODEL) # link author to the registered user 
    title = models.CharField(max_length=200) # set this to be the date later on 
    created_date = models.DateTimeField(auto_now_add=True) 
    body = models.IntegerField(blank=True, null=True, choices=FORM_CHOICES) 
    mind = models.IntegerField(blank=True, null=True, choices=FORM_CHOICES) 
    insights = models.TextField() 

    def publish(self): 
     self.save() 

    def __unicode__(self): 
     return self.title 

非常感谢提前。

+0

那么,你期望什么?一个'IntegerField'需要一个整数。你的选择是字符串。你需要在你的模型中使用一个CharField。 – dirkgroten

+0

当然!多么愚蠢的错误!十分感谢你的帮助。 –

+0

并学习如何使用调试器:当您可以真正看到您的表单发布的内容时,解决这类问题就容易得多了... – dirkgroten

FORM_CHOICES是字符串。所以你不能指望IntegerField这些选择进行验证。

  • 要么改变你的FORM_CHOICES为int值(例如(1, '非常糟糕'),(2, '坏' 的)...)
  • 或者更改模型的IntegerFieldCharField