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

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

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

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

Python

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

Q&A

解決済

1回答

2605閲覧

DJANGO の外部キーを設けたフィールドへの値代入について

yuujiMotoki

総合スコア90

Django

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

Python

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

0グッド

0クリップ

投稿2020/06/30 05:43

#内容
DJANGOを使ったスケジュールのWEBアプリを作成しており、一点つまずいている事があり
ご教授をお願いしたく思います。

#モデル
データの元になるCSVファイルと、スケジュールのモデルがあり
csvdata_fk を外部キーで連結しています。

CSVをUPLOADした後、リスト形式で表示しますが、
この際にHTML側のチェックボックスname="import_ids"の値を、
views.pyの中でids = request.POST.getlist('import_ids')゙
に引き渡す処理を書いています。

#問題点
Viewsの中で外部キーに値を与える際に、下記のエラーがでます。
そもそも、ids自体は、requestの中の値です。
モデルのインスタンスを与えるには、文字列を変換して、インスタンスを導くのか、
もしくは、HTMLテーブルのチェックボックスをAS_TABLEで与えられるように、forms.pyを修正するかの、どちらかと思いますが、コードの例がなくて悩んでいます。

お力添えをお願いしたく思います。

ValueError: Cannot assign "'1'": "Schedules.csvdata_fk" must be a "CsvData" instance. > c:\users\mm05162\desktop\django-master\django-master\myapp\views.py(81)csv_import() -> csvdata_fk = id

#コード

python

1models.py 2 3from django.db import models 4 5 6# Create your models here. 7class CsvData(models.Model): 8 description = models.CharField(max_length=255, blank=True) 9 document = models.FileField(upload_to='csvdatas/') 10 uploaded_at = models.DateTimeField(auto_now_add=True) 11 12 13class Schedules(models.Model): 14 # id = AutoField(primary_key=True) # 自動的に追加されるので定義不要 15 title = models.CharField(max_length=50) 16 action = models.CharField(max_length=20) 17 start_plan = models.DateTimeField(null=True) 18 end_plan = models.DateTimeField(null=True) 19 start_action = models.DateTimeField(null=True) 20 end_action = models.DateTimeField(null=True) 21 csvdata_fk = models.ForeignKey(CsvData, on_delete=models.CASCADE,null=True) 22 23 def __str__(self): 24 return self.title

python

1views.py 2 3@require_POST 4def import_(request): 5 ids = request.POST.getlist('import_ids')##checkbox = import_ids 6 for id in ids: 7 dats = CsvData.objects.filter(id__in=id) 8 main(dats,id) 9 10 return redirect('myapp:CsvList') 11 12def edit(request, id=None): 13 return HttpResponse("編集") 14 15def delete(request, id=None): 16 ids = get_object_or_404(CsvData, pk=id) 17 ids.delete() 18 return redirect('myapp:CsvList') 19 20def main(datas,id): 21 for file in datas: 22 if file: 23 saveFileName = urllib.parse.unquote(file.document.url) 24 saveFileName = os.path.normpath(settings.BASE_DIR + saveFileName) 25 if saveFileName.endswith('.xlsx'): 26 df = gt.main(saveFileName) 27 csv_import(df,id) 28 return redirect('myapp/Sch') 29 30def csv_import(df,id): 31 products = [] 32 for i in range(len(df)): 33 pdb.set_trace() 34 products.append( 35 Schedules( 36 title = df.iloc[i][1], 37 action = df.iloc[i][2], 38 start_plan = df.iloc[i][3], 39 end_plan = df.iloc[i][4], 40 csvdata_fk = id 41 ) 42 ) 43 Schedules.objects.bulk_create(products) 44

html

1 2{% block contents %} 3 <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main"> 4 <h2 class="page-header">元データ一覧</h2> 5 <div class="table-responsive"> 6 <a href="{% url 'myapp:CsvImport' %}">登録画面へ</a> 7 <form method="post" action="{% url 'myapp:import_' %}"> 8 <table class="table table-striped"> 9 <thead> 10 <tr> 11 <th></th> 12 <th>No</th> 13 <th>リスト名</th> 14 <th>データ</th> 15 <th>更新</th> 16 <th></th> 17 </tr> 18 </thead> 19 <tbody> 20 {% for item in items %} 21 <tr> 22 <td><input type="checkbox" name="import_ids" value="{{ item.id }}"></td>{# 追加する #} 23 <td>{{ item.id}}</td> 24 <td>{{ item.description}}</td> 25 <td>{{ item.document }}</td> 26 <td>{{ item.uploaded_at }}</td> 27 <td> 28 <a href="{% url 'myapp:edit' id=item.id %}" class="btn btn-primary btn-sm">編集</a> 29 <a href="{% url 'myapp:delete' id=item.id %}" class="btn btn-primary btn-sm" id="btn_del">削除</a> 30 </td> 31 </tr> 32 {% endfor %} 33 </tbody> 34 </table> 35 {% csrf_token %}{# 追加する #} 36 <input type="submit" value="インポート"> 37 </form> 38 </div> 39 </div> 40 41 42 <script> 43 $(function(){ 44 $("#btn_del").click(function(){ 45 if(confirm("削除しますか?")){ 46 //yesの処理(何もぜず進む) 47 }else{ 48 //cancelの処理 49 return false; 50 } 51 }); 52 }) 53 </script> 54 55{% endblock %}

python

1forms.py 2 3class CsvDataForm(forms.ModelForm): 4 class Meta: 5 model = CsvData 6 fields = ('description', 'document', )

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のようにしたらどうなりますか?

python

1from django.shortcuts import get_object_or_404 2from .models import CsvData 3products.append( 4 Schedules( 5 # snip 6 csvdata_fk = get_object_or_404(CsvData, pk=id), 7 ) 8)

投稿2020/06/30 05:56

hasami

総合スコア1277

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問