form.is_valid始终为false

时间:2018-10-31 10:34:22

标签: django django-forms

我一直试图弄清为什么form.is_valid总是返回false,但是我仍然没有弄清楚,这对我刚开始使用Django还是没有帮助的。

模型

class Post(models.Model):
STATUS_CHOICES = (
    ('d', 'Draft'),
    ('p', 'Published'),
)
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=120, null=True, blank=True)
text = models.TextField(max_length=500, null=True, blank=True)
slug = models.SlugField(max_length=40, unique=True)    
publish_date = models.DateTimeField(null=True)
status = models.CharField(choices=STATUS_CHOICES, max_length=1,default='d')

表格

class PostForm(forms.ModelForm):
class Meta:
    model = Post
    fields = ('title','author','slug','text','publish_date','status')

    widgets = {
        'title': forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Title'}),
        'author': forms.Select(),
        'slug': forms.TextInput(attrs={'class' : 'form-control', 'placeholder' : 'Slug'}),
        'text': forms.Textarea(attrs={'class' : 'form-control', 'placeholder' : 'Text'}),
        'publish_date': forms.DateInput(attrs={'class' : 'form-control', 'placeholder' : date.today}),
        'status': forms.NullBooleanSelect(attrs={'class' : 'form-control'}),
    }

查看

def admin(request):
if request.user.is_authenticated:
    if request.user.is_staff:
        users = User.objects.all().order_by('date_joined').reverse()[:5]
        posts = Post.objects.all().order_by('created').reverse()[:5]
        publications = Publication.objects.all().order_by('created').reverse()[:5]
        form = PostForm()
        args = {'profile' : users ,'posts' : posts, 'publications' : publications, 'form' : form }
        if request.POST:
            print('request is posting')
            if form.is_valid():
                form.save()
            else:
                print('Error in saving')
        return render(request, 'webadmin/index.html',args)
    else:
        return index(request)
else:
    return redirect('/webmaster/login/')

我希望您能为我提供帮助,谢谢OWO)/

1 个答案:

答案 0 :(得分:0)

这里:

form = PostForm()
if request.POST:
    if form.is_valid():

您正在尝试验证未绑定的表单,该表单肯定会失败-您必须传递数据(在这种情况下为request.POST)才能进行验证。您的代码实际上应该类似于:

# explicitely test against request.method - 
# you can have a POST request with an empty body, 
# in which case `request.POST` will be empty and
# have a false value in a boolean test
if request.method == "POST":
    form = PostForm(request.POST)
    if form.is_valid():
        # ...

现在即使通过request.POST 也不意味着您的表单将必须通过验证,但是仅打印诸如“'保存时出错'”之类的内容并不能告诉您什么地方有问题或遗漏。

无效的表单具有.errors属性,该属性列出了所有验证错误。如果您使用{{ form }}(或它们的变体{{ form.as_p }}{{ form.as_table }}等在模板中呈现表单,这些验证错误将自动显示在模板中(您未在此处发布)。您是手动呈现表单,还必须考虑自己呈现错误as documented here(我希望您至少是使用表单的字段进行呈现,而不是手动编写所有html表单代码。 ..)。

在所有情况下,您至少可以从在视图中打印form.errors开始,这样您就可以知道哪些内容无效,即:

    if form.is_valid():
        form.save()
    else:
         print("errors : {}".format(form.errors))

请注意,所有这些都已明确记录在案,因此您可以自己找到答案。我了解Django是一个相当大的框架,需要花费一些时间来掌握它,但是它有一个很好的教程和包含许多示例的大量文档,因此您应该真正地做一下教程并开始浏览文档,至少了解当某些“行不通”时可以在哪里找到以及在哪里进行搜索。