2Answer
コードを転記してもらわないと、回答も難しそうに思います。
添付いただいた画面からエスパーすると、
"コードと氏名"ということですが、画面の説明ではnumber,nameを読み取ると書きつつ、エラーでは、idとなっているので、数値と文字などで型が違うとかでしょうか
Comments
@taoikuieo
Questioner
回答ありがとうございます。
コードは全て転記した方がいいのでしょうか?
具体的にadmin.pyやmodels.pyなど何処のコードが必要か教えて頂けると助かります。Djangoでは決まった名前のファイルなのかもしれませんが、それぞれどのようなコードが書かれているかわからないので、ファイル名では指示できません。
csvファイルを読み込むところがあれば、まずは大丈夫かと思います。
コードを貼り付ける時には、コードの最初と最後に```をつけてくくってください。@taoikuieo
Questioner
関係ありそうな所を転記しますので、見て頂けますでしょうか?
admin.pyfrom django.contrib import admin from .models import WorkerCode from import_export import resources from import_export.admin import ImportExportModelAdmin from import_export.fields import Field class WorkerCodeResource(resources.ModelResource): number = Field(attribute="number", column_name="number") name = Field(attribute="name", column_name="name") class Meta: model = WorkerCode skip_unchanged = True use_bulk = True class WorkerCodeAdmin(ImportExportModelAdmin): ordering = ["number"] list_display = ("number", "name") admin.site.register(WorkerCode, WorkerCodeAdmin)
models.py
from django.db import models class WorkerCode(models.Model): number = models.CharField(max_length=11, blank=True, primary_key=True) name = models.CharField(max_length=20, blank=True, null=True)
宜しくお願いします。
定義が書かれたコードのように見えますが、それだけでcsvの取り込みがされるのでしょうか?
エラーでは、idと出ているように見えますが、そのエラーを出しているところのコードはありませんか?ファイル選択、というボタンか、確定かを押すと、パスなどを設定して、csvファイルの取り込みを始めるのではないかと思います。
その部分が見たいです。@taoikuieo
Questioner
django_import_exportという機能を追加してインポートボタンを押すとファイル選択画面が出て来るので、ファイルを選択して取り込むという流れになっています。
なのでpathの設定はしていません。djangoに詳しくないので、外しているかもしれませんが、
こちらを見ると、
import_id_fields
を指定しているように見えます。
今のコードでは、idとnameが標準であって、それに、numberとname(こっちは上書きかもしれませんが)を追加している形になっているのかもしれません。
id列を追加するか、
import_id_fields = ('number',)
としたら読み込めたりしませんか?@taoikuieo
Questioner
やり方が間違っていたのか出来ませんでした。
上記のサイトも拝見しましたが、何処を変更したらいいのかわからずでした。
わざわざ調べて頂いたのに申し訳ありません。csvのnumberを、idに変更したら、うまくいきませんか?
コードを直すなら、たぶん下記のような感じかなと思いますが、どうでしょうか
admin.pyclass WorkerCodeResource(resources.ModelResource): number = Field(attribute="number", column_name="number") name = Field(attribute="name", column_name="name") class Meta: model = WorkerCode skip_unchanged = True use_bulk = True + import_id_fields = ('number',) #<---
@taoikuieo
Questioner
"number"を全て"id"に変更したら下記のエラーが出ました。
ERRORS: <class 'myapp.admin.WorkerCodeAdmin'>: (admin.E033) The value of 'ordering[0]' refers to 'id', which is not a field of 'myapp.WorkerCode'. <class 'myapp.admin.WorkerCodeAdmin'>: (admin.E108) The value of 'list_display[0]' refers to 'id', which is not a callable or attribute of 'WorkerCodeAdmin', or an attribute, method, or field on 'myapp.WorkerCode'. System check identified 2 issues (0 silenced).
myapp.WorkerCode にidがないです、って書いてるように見えるので、コードの方もnumberをidにかえてください
list_displayもidがないので、numberをidにかえてください@taoikuieo
Questioner
すみません。こちらは画面が見えないので、エラーも結果もわかりません。
何かヒントをもらえないでしょうか
最初に投稿された画面の、エラーがなくて、真っ白な状態、ということでしょうかdatatype mismatchなので、型が違うのではないでしょうか
idに変えたことで、numberの11桁を元にしていると、桁が多すぎる、ということもあるのかもしれません。
csvを1列増やして、- idを1から連番ではじめて
- numberは元のまま
という風にした方がいいのかもしれませんね。
class WorkerCode(models.Model): number = models.CharField(max_length=11, blank=True, primary_key=True) name = models.CharField(max_length=20, blank=True, null=True)
@taoikuieo
Questioner
最初に投稿した画面の読み込んだプレビュー画面の所が変更されました。
行番号1 "id" → 行番号: 1 - datatype mismatch私の方の指示が悪くて、遠回りさせてしまっているようで、申し訳ありません。
次のようにしてみてもらえないでしょうか- コードを最初に提示してもらった状態に戻す
- csvは、元の状態に、1列増やして、"id"を連番で追加
これでどのような挙動になるか、確認していただけないでしょうか
問題がブラウザ側にあるのか(そもそもファイルがサーバーに送信されてない? 送信はされているが形式が正しくない?)、ブラウザ側は問題ないがサーバー側で受け取れないのか切り分けできませんか?
ブラウザからサーバーに送信されるヘッダとコンテンツの内容を Fiddler またはブラウザのディベロッパーツールでキャプチャしてその内容を見れば分かるはずです。
Comments
@taoikuieo
Questioner
回答ありがとうございます。
解決策を教えて下さり誠にありがたいのですが、初心者なものでおっしゃってることが難しくてわかりません。
わざわざ回答してくださったのに申し訳ありません。