本篇概述
Django Admin后台显示 多对多字段(如何)
Django 模板 显示 多对多字段(如何)
Django 将表单中上传的多对多字段存入数据库 (如何)
Django 上传文件 (如何)
models代码背景
1 class Tag(models.Model): 2 name = models.CharField(max_length=20, verbose_name="名称") 3 4 class work(models.Model): 5 Tag = models.ManyToManyField(Tag, verbose_name="标签")
一,Django Admin后台显示 多对多字段
于admin.py文件中
1 @admin.register(work) 2 class workAdmin(admin.ModelAdmin): 3 '''展示tags''' 4 def show_tags(self, obj): 5 return [tag.name for tag in obj.Tag.all()] 6 # 这里运用了Python的堆导式 7 show_tags.short_description = "标签" # 设置表头 8 list_display = ["show_tags"]
二,Django 模板 显示 多对多字段
先与 视图 views.py文件中
1 class IndexView(View): 2 def get(self, request): 3 works = work.objects.all()[:2] 4 5 context = { 6 'works': works, 7 } 8 return render(request, 'index.html', context)
然后,(urls.py中的配置就不多说了,直接进如何在模板中取得)
1 {% for work in works %} 2 {% for tag in work.Tag.all %} 3 {# 下面即 该作品对应的标签 #} 4 {{tag.name}} 5 {% endfor %} 6 {% endfor%}
三,Django 将表单中上传的多对多字段存入数据库
1、首先获取表单中上传的多对多数据,假设 上传的 标签(多)且 标签与作品 work 的关系是 ManyToManyField
1 # 标签
2 tag = request.POST.getlist("tag")
2、创建一个 work 对象 然后 进行数据的交互
1 works = work() 2 works.save() 3 # 多对多字段存入 4 for tags in tag: 5 id = Tag.objects.get(name=tags).id 6 works.Tag.add(id) 7 works.save()
当然这必须是 数据库中 Tag 要有的标签名称才行,不然找不到 id 无法存入,因为 add()方法就是的参数是 id,至于非标签已有存入 有待 摸索~~
四,Django上传文件,如何
1. 首先与 settings.py文件中增添
1 # 上传文件 2 3 MEDIA_ROOT = os.path.join(BASE_DIR, r'staticupfile')
2、于 模板 表单中 添加 input:file + tap 。。。
1 <input type="file" name="file">
3、修改 form 表单属性
1 method="post" 方法必须是 post 2 enctype="multipart/form-data" 上传文件必备
4、与视图Views.py文件中
1 # 这里 Django视图函数,我用的基于类的视图 2 # 例如 class AddView(View) 3 # 在其中 4 def post(self, request): 5 try: 6 f = request.FILES["file"] 7 # 合成文件在服务器端的路径 8 filePaths = "static/upfile/" + f.name # 这里的原因:如果是在分页中,文件路径会额外添加如 /page_id/ 导致后面调用失败,根据个人情况进行合理调整 9 filePath = os.path.join(settings.MEDIA_ROOT, f.name) 10 print(filePath) 11 with open(filePath, 'wb') as fp: 12 # 以文件流的形式一段段上传 13 for info in f.chunks(): 14 fp.write(info) 15 except: 16 return HttpResponse("上传失败")