最近有个需求
先看一下我们的
from django.db import models from django.contrib.auth import get_user_model class Message(models.Model): author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) body = models.TextField() create_time = models.DateTimeField(auto_now_add=True) def __str__(self): return self.body class Image(models.Model): file = models.ImageField(upload_to='upload/%Y/%m/%d/') message = models.ForeignKey(Message, on_delete=models.CASCADE)
每个
根据formset
from django.forms import modelformset_factory, BaseModelFormSet from .models import Image class BaseMultiImageFormSet(BaseModelFormSet): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.queryset = Image.objects.none() MultiImageForm = modelformset_factory(Image, fields=('file',), formset=BaseMultiImageFormSet)
如果像下面这样直接建立formset
formset
MultiImageForm = modelformset_factory(Image, fields=('file',))
接下来views.py
formset
@login_required def message(request): if request.POST and request.POST.get("body") is not None: mes = Message( author=request.user, body=request.POST["body"] ) if request.FILES or request.POST["body"]: mes.save() if request.FILES: files = MultiImageForm(request.POST, request.FILES) for file in files: image = file.save(commit=False) image.message = mes image.save() return redirect("/")
那么
login_required
- 第三行代码
检测, request.POST
body
- 建立一个
但暂时不存进数据库, - 检验是否有上传文件或者文字内容
如果两者都没有, 就不保存, 。 - 如果有上传文件
把, requst.POST
request.FILES
MultiImageForm
- 遍历所有的上传文件对象
并且对其每个都建立对应的, MultiImageForm
然后把这些对象的, 。 - 跳转至首页
这看起来很简单是吧
<form action="/message" method="post" enctype="multipart/form-data"> {% csrf_token %} <textarea rows="4" name="body"></textarea> <input type="hidden" name="form-TOTAL_FORMS" value="1" id="id_form-TOTAL_FORMS"> <input type="hidden" name="form-INITIAL_FORMS" value="0" id="id_form-INITIAL_FORMS"> <input type="hidden" name="form-MIN_NUM_FORMS" value="0" id="id_form-MIN_NUM_FORMS"> <input type="hidden" name="form-MAX_NUM_FORMS" value="1000" id="id_form-MAX_NUM_FORMS"> <div class="input-file"> <input type="file" name="form-0-file" accept="image/*" id="id_form-0-file"> <input type="hidden" name="form-0-id" id="id_form-0-id"> </div> <button type="submit">提交</button> </form>
除了
form-TOTAL_FORMS
它的值用来指定有几个需要上传的文件fomr-INITIAL_FORMS
它的值用来指定第一个上传文件的文件序号form-MIN_NUM_FORMS
它的值用来指定最少的上传文件数form-MAX_NUM_FORMS
它的值用来指定最大的上传文件数form-0-file
第一个上传文件的form-0-id
第一个上传文件的隐藏
我们需要几个文件上传就用input-file
form-1-file
)form-NUM-file
form-NUM-id
form-TOTAL_FORMS