删除时Django管理员错误

时间:2017-08-02 13:55:06

标签: django

我有一个奇怪的错误:

TypeError at /admin/wall/articles/
__str__ returned non-string (type Articles)

我有一个模型文章。 我只是尝试从Django的管理面板中删除我的数据库的一些文章。我说它很好奇,因为它只发生在一些物体上。我可以删除大多数文章,但由于某种原因,如果我删除它们,数据库中的某些条目会返回错误。对于我的其他车型来说,这不会发生。

这是phpmyadmin的屏幕截图,显示了我的表格中的所有条目"文章":

enter image description here

例如,我有一个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)

1 个答案:

答案 0 :(得分:2)

问题出在你喜欢的模型中。正如错误所说,该文章的__str__方法不返回字符串,而是返回文章的实例。您应确保实际返回一个字符串,例如self.articles.title

这是删除问题的原因是因为删除文章也会删除指向它的所有对象,Django会在确认页面上帮助显示所有受影响的对象。

注意,您的命名约定令人困惑。你应该坚持你的模型的单数名称:文章,评论。