本篇概述 Django Admin後臺顯示 多對多欄位(如何) Django 模板 顯示 多對多欄位(如何) models代碼背景 一,Django Admin後臺顯示 多對多欄位 於admin.py文件中 二,Django 模板 顯示 多對多欄位 先與 視圖 views.py文件中 然後,(url ...
本篇概述
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'static\upfile')
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("上傳失敗")View Code
5、然後 進行上傳,大功告成 ~~