我正在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时,我只能添加一个逻辑文件。
答案 0 :(得分:0)
您的问题是您的表单始终是unbounded
表单,这意味着它是在没有数据的情况下初始化的。根据数据,我的意思是来自请求的POST
或GET
数据或模型的实例。 unbounded
表单始终会失败is_valid()
并且手动将任何内容分配给add_instance = AddForm()
然后add_instance.post = instance
等表单实例没有意义。
django doc说明了如何使用表单。
您无法使用一个表单上传多个文件,因为每个表单都是Add
模型表单。您应该使用ModelFormSet
AddForm
在一个提交中添加多个模型实例。
django doc说明了如何使用ModelFormSet
。
顺便说一句,我发现模型名称Add
非常混乱,请考虑将其更改为Attachment
或PostFile
或其他内容。
修改强>
我没有尝试过,但是如果你想要一个小部件用于多个文件,你可以在视图中执行此操作:
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()