Django Admin中删除操作的奇怪错误

问题描述 投票:0回答:1

Django Admin中删除操作的奇怪错误。我可以从控制台删除对象但不能从管理面板删除。似乎与字段有关。

class CategoryAdmin(DistributedAdminMixin, admin.ModelAdmin):
    exclude = ('terminal',)

class ArticleAdmin(DistributedAdminMixin, admin.ModelAdmin):
    exclude = ('terminal',)
    list_display = ('title', 'is_displayed', 'category')
    search_fields = ('title', 'category')
    readonly_fields = ('created_by',)


admin.site.register(Category, CategoryAdmin)
admin.site.register(Article, ArticleAdmin)

这是日志

      File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
        response = wrapped_callback(request, *callback_args, **callback_kwargs)
          File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 575, in wrapper
        return self.admin_site.admin_view(view)(*args, **kwargs)
      File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/sites.py", line 223, in inner
    return view(request, *args, **kwargs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/utils/decorators.py", line 62, in _wrapper
    return bound_func(*args, **kwargs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/utils/decorators.py", line 58, in bound_func
    return func.__get__(self, type(self))(*args2, **kwargs2)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1618, in changelist_view
    response = self.response_action(request, queryset=cl.get_queryset(request))
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/options.py", line 1331, in response_action
    response = func(self, request, queryset)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/actions.py", line 36, in delete_selected
    queryset, opts, request.user, modeladmin.admin_site, using)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/utils.py", line 131, in get_deleted_objects
    collector.collect(objs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/contrib/admin/utils.py", line 195, in collect
    return super().collect(objs, source_attr=source_attr, **kwargs)
  File "/home/artem/Projects/carbon-delta-lab/.venv/lib/python3.6/site-packages/django/db/models/deletion.py", line 222, in collect
    field.remote_field.on_delete(self, field, sub_objs, self.using)
TypeError: 'str' object is not callable

您可以在上面看到的型号代码。对于外键关系使用CASCADE一对多

class Category(DistributedModel):
    """
    Model that represents categories for methodologies
    """
    title = models.CharField(
        max_length=200
    )

    def __str__(self):
        return self.title


# Standard file download via /media is disallowed.
fs = FileSystemStorage(location=settings.METHODOLOGIES_FILE_DIR)


class Article(DistributedModel):
    """
    Article model that represents Methodology description.
    It is used on 1. terminal methodology page and
                  2. methodologies list page
    """
    title = models.CharField(
        max_length=200,
        help_text="Title displayed on both methodology page and methodologies list pages."
    )
    slug = models.SlugField(
        unique=True,
        help_text="What should be the unique identifying key word in the url of the page?")
    short_text = models.TextField(
        max_length=500, help_text="Short summary displayed only in preview box on methodologies list page. "
                                  "Max 500 chars."
    )
    full_text = models.TextField(
        help_text="Full article displayed only on terminal methodology page."
    )
    image = models.ImageField(
        null=True,
        blank=True,
        help_text="Recommended width at least 1200px. Please prefer to add images. "
                  "Image used on both pages."
    )
    button_text = models.CharField(
        default='SHOW MORE',
        max_length=100
    )
    category = models.ForeignKey(
        Category,
        on_delete="CASCADE"
    )
    related_articles = models.ManyToManyField(
        "self",
        blank=True,
        help_text="Links of these articles will be displayed at the bottom of the page. "
                  "If empty, articles of the same category will be displayed. "
    )

    file = models.FileField(
        blank=True,
        null=True,
        storage=fs,
        help_text="Upload pdf, doc, xlsx, etc. related to this article. Files will be attached to the end "
                  "of the article for download. "
    )

    created = models.DateTimeField(
        auto_now_add=True
    )
    modified = models.DateTimeField(
        auto_now=True
    )
    created_by = models.ForeignKey(
        User,
        null=True,
        blank=True,
        on_delete="SET_NULL"
    )
    is_displayed = models.BooleanField(
        default=False
    )

    def save(self, *args, **kwargs):
        if not self.created_by:
            # using threadlocals is bad
            self.created_by = get_current_user()
        super(Article, self).save(*args, **kwargs)

也许这与数据库有关?但似乎在对DB的任何查询之前它都失败了

django django-admin
1个回答
0
投票

似乎created_by模型的字段categoryArticle具有无效的on_delete属性:应该是:

on_delete=models.SET_NULL代替on_delete="SET_NULL"

on_delete=models.CASCADE代替on_delete="CASCADE"

© www.soinside.com 2019 - 2024. All rights reserved.