#内容
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', )
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。