为什么我的模型表格没有通过验证

时间:2015-12-28 14:34:17

标签: python django forms

我正在django写简单的博客,我上传了文件。 我想创建模板,用户可以写帖子并添加多个文件。因此,我创造了模型:

 class Post(models.Model):
    title= models.CharField(verbose_name=u"post title", max_length=40, blank=False)
    body= models.TextField(verbose_name=u"post body", blank=False)
    author= models.ForeignKey(User, blank=False)
    published= models.DateTimeField(verbose_name=u"data publikacji", blank=True, null=True)

class Add(models.Model):
    post=models.ForeignKey(Post)
    file=models.FileField(upload_to='adds', verbose_name=u"added files")

然后我创建了这样的模板:

    {% block content %}
<div class="col-lg-6 col-md-offset-3">
<form enctype="multipart/form-data" method="post" adction="{% url 'create_post' %}">{% csrf_token %}
{{post_form|crispy}}
<input type="file" name="files" multiple/></br>
<input class="btn btn-success" style="width:100%" type="submit" value="Dodaj post"/>
</form>
</div>
{% endblock %}
之后我写了一个简单的视图来处理文件和帖子创建:

def create_post(request):
if request.method== 'GET':
    post_form=PostForm()
    add_form=AddForm()
    context={
        'post_form': post_form,
    }
    return render(request, 'create_post.html', context)
else:
    post_form=PostForm(request.POST)

    if post_form.is_valid():
        instance=post_form.save(commit=False)
        instance.published=datetime.datetime.now()
        instance.author=request.user
        instance.save()
        # import ipdb
        # ipdb.set_trace()
        for file in request.FILES.getlist("files"):
            add_instance=AddForm()
            add_instance.post=instance
            add_instance.file=file
            if add_instance.is_valid():
                add_instance.save()


        return redirect(reverse('AllPosts'))    

但add_instance都没有通过验证“is_valid”。但为什么? 第二个问题是有没有办法在模板中使用Form来编写文件的原始输入?当我使用AddForm时,我只能添加一个逻辑文件。

1 个答案:

答案 0 :(得分:0)

您的问题是您的表单始终是unbounded表单,这意味着它是在没有数据的情况下初始化的。根据数据,我的意思是来自请求的POSTGET数据或模型的实例。 unbounded表单始终会失败is_valid()并且手动将任何内容分配给add_instance = AddForm()然后add_instance.post = instance等表单实例没有意义。

django doc说明了如何使用表单。

您无法使用一个表单上传多个文件,因为每个表单都是Add模型表单。您应该使用ModelFormSet AddForm在一个提交中添加多个模型实例。

django doc说明了如何使用ModelFormSet

顺便说一句,我发现模型名称Add非常混乱,请考虑将其更改为AttachmentPostFile或其他内容。

修改

我没有尝试过,但是如果你想要一个小部件用于多个文件,你可以在视图中执行此操作:

for upload_file in request.FILES.getlist('files'):
    form = AddForm(request.POST, {'file': upload_file})
    if form.is_valid():
        new_file = form.save(commit=False)
        new_file.post = instance
        new_file.save()