【发布时间】:2021-07-10 08:39:14
【问题描述】:
这似乎是一个非常简单的问题,但我真的不知道发生了什么。我在理解 Django 管理站点上的保存过程时遇到了一些问题。情况就是这样,尽可能简化:
models.py
import uuid
from django.conf import settings
from django.db import models
class BaseModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=settings.IS_DEV)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Order(BaseModel):
[various properties and functions]
class Article(BaseModel):
order = models.ForeignKey(Order, null=True, on_delete=models.CASCADE, related_name='articles')
[various properties and functions]
class PaymentOperation(BaseModel):
order = models.ForeignKey(Order, null=True, on_delete=models.CASCADE)
[various properties and functions]
admin.py
from django.conf import settings
from django.contrib import admin
from models import Order, Article, PaymentOperation
class BaseModelAdmin(admin.ModelAdmin):
readonly_fields = ['created', 'modified']
if not settings.IS_DEV:
readonly_fields.append('id')
class ArticleInline(admin.TabularInline):
fields = ['id', ...]
readonly_fields = ['id', ...]
can_delete = False
extra = 0
max_num = 0
[more code]
class PaymentOperationInline(admin.TabularInline):
fields = ['id', ...]
readonly_fields = ['id', ...]
can_delete = False
extra = 0
max_num = 0
[more code]
class OrderAdmin(BaseModelAdmin):
readonly_fields = BaseModelAdmin.readonly_fields + [...]
fieldsets = [...]
inlines = [ArticleInline, PaymentOperationInline]
[more code]
class ArticleAdmin(BaseModelAdmin):
readonly_fields = BaseModelAdmin.readonly_fields + [...]
fieldsets = [...]
[more code]
这是主要结构,但我不确定它是否足以产生问题。我不想用数百行代码阻塞这个问题。如有必要,我会尝试更具体。
Order 和 Article 模型中的某些字段是可编辑的,而 PaymentOperation 模型中的所有字段都是只读的。
如果我从其管理页面编辑一篇文章,它会完美运行。另一方面,如果我尝试编辑订单,然后将其保存,则页面表现异常。订单未保存,页面顶部出现错误消息,提示“请更正以下错误”。所有字段,无论是可编辑的还是只读的,都保持不变。页面底部的两个内联处于更糟糕的状态。所有只读字段都重置为默认值(如果可用)或为空,并且所有 ID 都不同。文章内联的可编辑字段保持不变。在我看来,该页面正在尝试创建新条目,而不是编辑旧条目。
我尝试一次注释掉OrderAdmin 声明中的内联,但没有效果。注释掉两者可以让我正确保存订单。
我还尝试将save_model 和save_formset 添加到OrderAdmin,但无论错误是什么,它都是在调用这些函数之前产生的。我运行 python manage.py runserver 的 shell 甚至没有显示任何错误消息。
models.py 和admin.py 中还有很多其他型号,没有一个有同样的问题。其中一些模型甚至有自己的内联。
我真的很困惑。我试图了解上面显示的代码部分与其余部分之间的区别,但我找不到它。我知道在几天前添加付款操作之前保存过程有效,而且我几乎可以肯定我没有更改订单和文章模型中的任何内容(我会检查一下,以确保确定)。在这一点上,我不确定我是否理解了保存过程,或者代码有什么问题。
编辑:我找不到对订单和文章模型以及它们的管理员对应的重大更改。
【问题讨论】:
标签: python-3.x django django-admin