モデルの1つにインスタンスを追加しようとすると、管理者はこのエラーを返します。モデル自体には正しいstr()メソッドがあり、インスタンスはまだ含まれていません。 str()メソッドを静的メソッドに置き換えるか、完全に削除してみました。運が悪い。
このエラーは、管理者の履歴部分で問題が発生していることを示しているようです。 Stacktraceは33行目を指しています。
Error during template rendering
In template /Users/snirp/juis/snirpdrive/glotto/venv/lib/python3.6/site-packages/Django/contrib/admin/templates/admin/change_form.html, error at line 33
__str__ returned non-string (type NoneType)
23 {% endblock %}
24 {% endif %}
25
26 {% block content %}<div id="content-main">
27 {% block object-tools %}
28 {% if change %}{% if not is_popup %}
29 <ul class="object-tools">
30 {% block object-tools-items %}
31 <li>
32 {% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
33 <a href="{% add_preserved_filters history_url %}" class="historylink">{% trans "History" %}</a>
34 </li>
35 {% if has_absolute_url %}<li><a href="{{ absolute_url }}" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif %}
36 {% endblock %}
37 </ul>
38 {% endif %}{% endif %}
39 {% endblock %}
40 <form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.model_name }}_form" novalidate>{% csrf_token %}{% block form_top %}{% endblock %}
41 <div>
42 {% if is_popup %}<input type="hidden" name="{{ is_popup_var }}" value="1" />{% endif %}
43 {% if to_field %}<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}" />{% endif %}
これらは私のmodels.py
とadmin.py
の関連部分です
class UserContent(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
created_by = models.ForeignKey(User, related_name='%(class)s_creator')
updated_by = models.ForeignKey(User, related_name='%(class)s_updater')
class Meta:
abstract = True
class Linetrans(UserContent):
line = models.ForeignKey(Line)
translation = models.ForeignKey(Translation)
text = models.CharField(max_length=400)
#def __str__(self):
# return self.text
class Meta:
ordering = ['line']
そして
admin.site.register(Linetrans)
他のモデルクラスは非常に似ており、エラーを返しません。このエラーは、Linetransが別の管理クラスにインラインとして追加された場合にも発生します。
編集/更新:モデル内の他のすべてのstr()メソッドをコメントアウトしましたが、エラーが解消されたようです。現在、問題を特定しようとしています。
関連モデルに予期しない空のCharFieldがあったことが判明しました。他の人を助けるかもしれないので、これを答えのままにしておきます。
問題のトラブルシューティング問題のあるモデルが見つかるまで、モデルの__str__()
メソッドを体系的にコメント化します。そこから作業して、問題のあるレコードを特定します。
同様の問題がありました。問題は、1つの行の主キーがnullであったことでした(それがどのように発生したかはわかりません)。カスケードの問題のため、行を削除できませんでした。だから私はstr mmethodをこのようなものに変更しなければなりませんでした。
def __str__(self):
if self.customerName==None:
return "ERROR-CUSTOMER NAME IS NULL"
return self.customerName
この問題の原因となっているモデル内のインスタンスをDjango Shell python manage.py Shell
から削除することもできます。これは、私のような関連モデルが多数あるモデルを扱う場合に役立ちます。
通常、この問題は、インスタンスが相互に互換性がなく、関連するフィールドと互換性がないように、モデルフィールドを変更して移行することによって発生します。
私の場合、同じ問題があり、その起源は次のとおりでした:__str__
関数で使用されるフィールドの場合、データベースにnull値が保存されます。
だから私はこのようなことをして問題を解決することができます:
update table
set field_for_STR_use = 'any value'
where field_for_STR_use is null or field_for_STR_use = ''
その後、私は自分の見解を更新しただけで、問題は解消されました。
あなたが参照したクラスをチェックしてください
models.ForeignKey
問題はにあります
__str__()
それらのクラスの1つのメソッド。それから加えて
or ''
このようなクラスのreturnステートメントで。
def __str__(self):
return self.title or ''
__str__()
を使用してForeignKey
またはOneToOneField
の値を返そうとすると、エラーが返されます。
例:
def __str__():
return self.user # where user is a key to other model class
そのはず:
def __str__():
return self.user.__str__()
# Or basically any other way that would explicitly unbox the value inside the related model class.
このエラーには、2つの解決策を使用できます
最初の解決策:コードの下でコメント化できます
def __str__(self):
return self.id
に
#def __str__(self):
# return self.id
秒解:オブジェクトから文字列を返すことができます
def __str__(self):
return str(self.id)
私の場合、VSCodeからのデフォルトのスニペットを次のように持つ別のモデルによって呼び出された別のモデルがありました。
def __str__(self):
return
これにより、ログに別の場所に表示されていても、エラーが発生していました。
def __str__(self):
return str(self.topic)
Strを使用して文字列型にします。それなら、それは文字列型ではありません。