web-dev-qa-db-ja.com

管理者のエラー:__ str__が文字列以外を返しました(タイプNoneType)

モデルの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.pyadmin.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()メソッドをコメントアウトしましたが、エラーが解消されたようです。現在、問題を特定しようとしています。

7
Roy Prins

関連モデルに予期しない空のCharFieldがあったことが判明しました。他の人を助けるかもしれないので、これを答えのままにしておきます。

問題のトラブルシューティング問題のあるモデルが見つかるまで、モデルの__str__()メソッドを体系的にコメント化します。そこから作業して、問題のあるレコードを特定します。

39
Roy Prins

同様の問題がありました。問題は、1つの行の主キーがnullであったことでした(それがどのように発生したかはわかりません)。カスケードの問題のため、行を削除できませんでした。だから私はstr mmethodをこのようなものに変更しなければなりませんでした。

def __str__(self):
    if self.customerName==None:
        return "ERROR-CUSTOMER NAME IS NULL"
    return self.customerName
9

この問題の原因となっているモデル内のインスタンスをDjango Shell python manage.py Shellから削除することもできます。これは、私のような関連モデルが多数あるモデルを扱う場合に役立ちます。

通常、この問題は、インスタンスが相互に互換性がなく、関連するフィールドと互換性がないように、モデルフィールドを変更して移行することによって発生します。

1
スラッシュ

私の場合、同じ問題があり、その起源は次のとおりでした:__str__関数で使用されるフィールドの場合、データベースにnull値が保存されます。

だから私はこのようなことをして問題を解決することができます:

update table
set field_for_STR_use = 'any value'
where field_for_STR_use is null or field_for_STR_use = ''

その後、私は自分の見解を更新しただけで、問題は解消されました。

1
hmatus

あなたが参照したクラスをチェックしてください

        models.ForeignKey 

問題はにあります

        __str__() 

それらのクラスの1つのメソッド。それから加えて

                             or ''

このようなクラスのreturnステートメントで。

        def __str__(self):
            return self.title or ''
1
Dimanjan

__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.
0
Ramy M. Mousa

このエラーには、2つの解決策を使用できます

最初の解決策:コードの下でコメント化できます

 def __str__(self):
    return self.id

 #def __str__(self):
 #  return self.id

秒解:オブジェクトから文字列を返すことができます

 def __str__(self):
    return str(self.id)
0
sanjay

私の場合、VSCodeからのデフォルトのスニペットを次のように持つ別のモデルによって呼び出された別のモデルがありました。

def __str__(self):
    return

これにより、ログに別の場所に表示されていても、エラーが発生していました。

0
tonhozi
def __str__(self):
        return str(self.topic)

Strを使用して文字列型にします。それなら、それは文字列型ではありません。

0
1UC1F3R616