我有一个奇怪的错误:
TypeError at /admin/wall/articles/
__str__ returned non-string (type Articles)
我有一个模型文章。 我只是尝试从Django的管理面板中删除我的数据库的一些文章。我说它很好奇,因为它只发生在一些物体上。我可以删除大多数文章,但由于某种原因,如果我删除它们,数据库中的某些条目会返回错误。对于我的其他车型来说,这不会发生。
这是phpmyadmin的屏幕截图,显示了我的表格中的所有条目"文章":
例如,我有一个id为70的条目。在Django管理面板中,我无法删除它,我有一个错误。为了测试,重新创建确切的条目(参见id 75),我可以从django admin pannel中删除这个条目。
为什么我可以删除一些内容但不是全部?
这是我的models.py:
from django.db import models
from start.models import Games
from django.contrib.auth.models import User
from tinymce.models import HTMLField
# Create your models here.
def user_directory_path_articles(instance, filename):
return 'media/user/user_{0}/articles/{1}/'.format(instance.user.id, filename)
def user_directory_path_comments(instance, filename):
return 'media/user/user_{0}/comments/{1}/'.format(instance.user.id, filename)
def validate_file_extension(value):
import os
from django.core.exceptions import ValidationError
ext = os.path.splitext(value.name)[1] # [0] returns path+filename
valid_extensions = ['.jpg', '.png']
if not ext.lower() in valid_extensions:
raise ValidationError(u'Merci d\'utiliser le format JPG ou PNG')
class Articles(models.Model):
title = models.CharField(max_length=50, null=False, verbose_name="Titre")
text = HTMLField()
image = models.FileField(upload_to='media/articles/', validators=[validate_file_extension], blank=True, null=True, verbose_name="Image de présentation")
games = models.ForeignKey(Games, verbose_name="Jeux", blank=True, null=True)
author = models.ForeignKey(User, verbose_name="Auteur")
is_statut = models.BooleanField(default=True, verbose_name="Statut")
date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")
def __str__(self):
return self.title
class Comments(models.Model):
text = models.CharField(max_length=300, null=False)
image = models.FileField(upload_to=user_directory_path_comments, validators=[validate_file_extension], blank=True, null=True)
articles = models.ForeignKey(Articles, verbose_name="Article", null=False, related_name='comments')
author = models.ForeignKey(User, verbose_name="Auteur")
in_answer_to = models.ForeignKey('self', verbose_name="En réponse au commentaire", blank=True, null=True, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True, auto_now=False, verbose_name="Date de création")
update = models.DateTimeField(auto_now=True, verbose_name="Dernière modification")
def __str__(self):
return self.text
class Like(models.Model):
articles = models.ForeignKey(Articles, verbose_name="Article", null=True, blank=True)
user = models.ForeignKey(User, verbose_name="Auteur", null=False)
def __str__(self):
return self.articles
class Up(models.Model):
comments = models.ForeignKey(Comments, verbose_name="Commentaire", null=True, blank=True)
user = models.ForeignKey(User, verbose_name="Auteur", null=False)
这是我的admin.py:
from django.contrib import admin
from .models import Articles, Comments
# Register your models here.
class ArticlesAdmin(admin.ModelAdmin):
list_display = ('date', 'title', 'author', 'games', 'is_statut', 'update')
fieldsets = (
('Général', {
'fields': ('title', 'author', 'is_statut')
}),
('Choisir une image de présentation', {
'fields': ('image',)}),
('Contenu de l\'article', {
'fields': ('text',)}),
('En rapport avec le jeu :', {
'fields': ('games',)}),
)
admin.site.register(Articles, ArticlesAdmin)
这是我的错误页面的追溯,感谢您的帮助:
Environment:
Request Method: POST
Request URL: http://*******:8000/admin/wall/articles/
Django Version: 1.11.2
Python Version: 3.5.3
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'widget_tweaks',
'tinymce',
'start',
'myaccount',
'wall']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/options.py" in wrapper
551. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/utils/decorators.py" in _wrapped_view
149. response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/decorators/cache.py" in _wrapped_view_func
57. response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/sites.py" in inner
224. return view(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/utils/decorators.py" in _wrapper
67. return bound_func(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/utils/decorators.py" in _wrapped_view
149. response = view_func(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/utils/decorators.py" in bound_func
63. return func.__get__(self, type(self))(*args2, **kwargs2)
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/options.py" in changelist_view
1568. response = self.response_action(request, queryset=cl.get_queryset(request))
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/options.py" in response_action
1286. response = func(self, request, queryset)
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/actions.py" in delete_selected
37. queryset, opts, request.user, modeladmin.admin_site, using)
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/utils.py" in get_deleted_objects
172. to_delete = collector.nested(format_callback)
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/utils.py" in nested
232. roots.extend(self._nested(root, seen, format_callback))
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/utils.py" in _nested
216. children.extend(self._nested(child, seen, format_callback))
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/utils.py" in _nested
218. ret = [format_callback(obj)]
File "/usr/local/lib/python3.5/dist-packages/django/contrib/admin/utils.py" in format_callback
145. force_text(obj))
File "/usr/local/lib/python3.5/dist-packages/django/utils/encoding.py" in force_text
76. s = six.text_type(s)
Exception Type: TypeError at /admin/wall/articles/
Exception Value: __str__ returned non-string (type Articles)
答案 0 :(得分:2)
问题出在你喜欢的模型中。正如错误所说,该文章的__str__
方法不返回字符串,而是返回文章的实例。您应确保实际返回一个字符串,例如self.articles.title
。
这是删除问题的原因是因为删除文章也会删除指向它的所有对象,Django会在确认页面上帮助显示所有受影响的对象。
注意,您的命名约定令人困惑。你应该坚持你的模型的单数名称:文章,评论。