お疲れ様です。下記質問です。
やりたいこと
ファイルのアップロードを行いたいと思っています。
当初、models.FileField
を使ってモデルを組みファイルのアップロードを行っていました。次にmodels.BinaryField
を使ってのファイルアップロード機能も追加したくなったのですが、これができません。
以下に成功しているmodels.FileField
と失敗しているmodels.BinaryField
の例を掲載します。実装方法はほとんど同じようにしているのですが、BinaryField
でうまくいかない理由がありましたら教えてください。
成功しているmodels.FileField
python
1# models.py 2class UploadFile(models.Model): 3 file = models.FileField('ファイル') 4 5 def __str__(self): 6 return self.file.url 7 8# forms.py 9class PDFUploadModelForm(forms.ModelForm): 10 11 class Meta: 12 model = UploadFile 13 fields = '__all__' 14 15# Views.py 16class PDFUploadModelView(generic.CreateView): 17 model = UploadFile 18 form_class = PDFUploadModelForm 19 template_name = 'subjects/upload.html' 20 success_url = reverse_lazy('subjects:subject-list') 21 22# urls.py 23urlpatterns = [ 24 path('pdf-upload', PDFUploadModelView.as_view(), name='pdf-upload'), 25] 26
html{%
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet"> 7 <title>project</title> 8 <!-- <link rel="stylesheet" href="{ static 'board/project.css' %}" /> --> 9</head> 10<body> 11 12<form action="" method="POST" enctype="multipart/form-data"> 13 {{ form.as_p }} 14 {% csrf_token %} 15 <button type="submit">送信</button> 16</form> 17 18{% if download_url %} 19 <a href="{{ download_url }}">{{ download_url }}</a> 20{% endif %} 21 22</body> 23</html> 24
失敗しているmodels.BinaryField
python
1# models.py 2class BLOBUploadFile(models.Model): 3 file = models.BinaryField('BLOBファイル') 4 5 def __str__(self): 6 return self.file.url 7 8# forms.py 9class BLOBUploadModelForm(forms.ModelForm): 10 11 class Meta: 12 model = BLOBUploadFile 13 fields = '__all__' 14 15# Views.py 16class BLOBUploadModelView(generic.CreateView): 17 model = BLOBUploadFile 18 form_class = BLOBUploadModelForm 19 template_name = 'subjects/blob_upload.html' 20 success_url = reverse_lazy('subjects:subject-list') 21 22# urls.py 23urlpatterns = [ 24 path('blob-upload', BLOBUploadModelView.as_view(), name='blob-upload'), 25] 26
html{%
1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <link href="https://fonts.googleapis.com/css?family=Open+Sans" rel="stylesheet"> 7 <title>project</title> 8 <!-- <link rel="stylesheet" href="{ static 'board/project.css' %}" /> --> 9</head> 10<body> 11 12<form action="" method="POST" enctype="multipart/form-data"> 13 {{ form.as_p }} 14 {% csrf_token %} 15 <button type="submit">送信</button> 16</form> 17 18{% if download_url %} 19 <a href="{{ download_url }}">{{ download_url }}</a> 20{% endif %} 21 22</body> 23</html> 24
試したこと
・views.pyを関数で書き直しました。結果は同じですが、下記でgetを送出した際formの中身が空でした。ModelFormで生成したはずのformがバイナリフィールドだと生成されないのでしょうか。
python
1bdef blob_upload_view(request): 2 if request.method == "POST": 3 print("POSTにきた") 4 form = BLOBUploadModelForm(request.POST, request.FILES) 5 if form.is_valid(): 6 form.save() 7 return HttpResponseRedirect(reverse_lazy('subjects:subject-list')) 8 else: 9 form = BLOBUploadModelForm() 10 print("GET:", form) 11 return render(request, 'subjects/blob_upload.html', {'form': form})
他にも試せそうなことがありましたら、ご指摘ください。
備考
Django 2.2
Python 3.6
あなたの回答
tips
プレビュー