質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2980閲覧

Django ファイルアップロードしない時、既存の値を登録したい

nuko3

総合スコア31

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/16 07:20

編集2019/04/16 07:41

DetailView+CreateView(参考サイト)を使いデータベースに編集履歴が残る台帳を作っています。
編集(ファイルアップロードも含む)をすると新しく行が追加され理想通りに動きます。次回編集時には、文字等はフォームに入力されているため登録されますが、ファイルアップロードの欄が空欄な為、履歴には空欄が登録されてしまいます。
値はあるので初期値で行こうとしたら、type=fileなので出来ませんでした。
これを、UpdateViewの動作のような、ファイルアップロードしない時は変えずに登録することはできないでしょうか?

初回編集時(ファイルアップロードする、~/カレンダー.pdfが登録)
イメージ説明
次回編集時(ファイルアップロードしない、「選択されていません」の状態なので空欄が登録される)
イメージ説明

### コード

Python

1#models.py 2class UploadModel(models.Model): 3 Name = models.CharField(db_column='名前', max_length=255, blank=True, null=False, primary_key=True) 4 attach = models.FileField(upload_to=directory_path, blank=True, null=True, validators=[FileExtensionValidator(['pdf', ])]) 5 class Meta: 6 managed = False 7 db_table = '台帳履歴'

Python

1#forms.py 2class UploadForm(forms.ModelForm): 3 Name = forms.CharField(label='名前', max_length=255, widget=forms.TextInput(), required=True) 4 attach = forms.FileField(label='PDFファイル', required=False) 5 class Meta: 6 model = UploadModel 7 fields = ('Name','attach',)

Python

1#views.py 2class DetailView(generic.DetailView): 3 model = UploadModel 4 template_name = 'UploadModel/detail.html' 5 6class DetailCreateView(LoginRequiredMixin, ModelFormMixin, generic.DetailView): 7 login_url = '/accounts/login/' 8 model = UploadModel 9 form_class = UploadForm 10 template_name = 'UploadModel/update.html' 11 def get_success_url(self): 12 return reverse('UploadModel:detail', kwargs={'pk': self.kwargs['pk']}) 13 14 def form_valid(self, form): 15 post_pk = self.kwargs['pk'] 16 comment = form.save(commit=False) 17 comment.post = get_object_or_404(UploadModel, pk=post_pk) 18 comment.save() 19 return redirect('UploadModel:detail', pk=post_pk) 20 21 def post(self, request, *args, **kwargs): 22 form = self.get_form() 23 if form.is_valid(): 24 return self.form_valid(form) 25 else: 26 self.object = self.get_object() 27 return self.form_invalid(form)

html

1<!--update.html--> 2{% extends 'main/layout.html' %} 3{% load static %} 4{% block content %} 5<form name="form" method="post" onsubmit="return false;" enctype="multipart/form-data"> 6 {% csrf_token %} 7 <table> 8 <tbody> 9 <tr><td>名前*</td> 10 <td>{{ form.Name }}</td> 11 </tr> 12 <tr><td height="50" width="30%">PDFアップロード</td> 13 <td width="70%">{{ form.attach }} 14 {% if form.attach.errors %} 15 <span style="color:red;font-size:small">{{ form.attach.errors }}</span> 16 {% endif %} 17 </td> 18 </tr> 19 </tbody> 20 </table> 21</form> 22{% endblock %}

###環境
Python:3.7
Django:2.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

次のような感じで comment.attach の値をチェックして、空の場合は前の値にフォールバックさせるようにするとよいのではないでしょうか。

patch

1- comment.post = get_object_or_404(UploadModel, pk=post_pk) 2+ if not comment.attach: 3+ comment.attach = get_object_or_404(UploadModel, pk=post_pk).attach 4 comment.save() 5 return redirect('UploadModel:detail', pk=post_pk)

(私の環境で動作確認していないので、そのまま動くかどうかは保証できません。アイデアのみ参考にしていただければと思います)

投稿2019/04/18 08:15

編集2019/04/26 04:57
gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nuko3

2019/04/21 23:05

この回答により、プログラムの動きがわかってきました。 とても参考になりました。ありがとうございます。
gh640

2019/04/26 04:54

そうでしたか、前進されたとのことでよかったです。 (回答文の `comment.save()` のインデントがおかしかったですね。その点だけ回答文を修正します)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問