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