【问题标题】:Saving a model with inlines in Django在 Django 中使用内联保存模型
【发布时间】: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_modelsave_formset 添加到OrderAdmin,但无论错误是什么,它都是在调用这些函数之前产生的。我运行 python manage.py runserver 的 shell 甚至没有显示任何错误消息。

models.pyadmin.py 中还有很多其他型号,没有一个有同样的问题。其中一些模型甚至有自己的内联。

我真的很困惑。我试图了解上面显示的代码部分与其余部分之间的区别,但我找不到它。我知道在几天前添加付款操作之前保存过程有效,而且我几乎可以肯定我没有更改订单和文章模型中的任何内容(我会检查一下,以确保确定)。在这一点上,我不确定我是否理解了保存过程,或者代码有什么问题。

编辑:我找不到对订单和文章模型以及它们的管理员对应的重大更改。

【问题讨论】:

    标签: python-3.x django django-admin


    【解决方案1】:

    显然,整个问题都存在于每个模型 ID 的 editable=settings.IS_DEV 设置中。我不知道具体原因,但是设置editable=False 可以解决问题。

    我注意到我从来没有在生产服务器上遇到过这个问题,只是在标记为开发的服务器上。幸运的是,能够设置一个特定的 ID 只在非常有限的情况下有用,所以我不会错过它,但我觉得我只是用一个不那么烦人的问题交换了一个问题。如果有人有更好的解决方案,我很乐意改变主意并将其视为此问题的答案。

    【讨论】:

      猜你喜欢
      • 2019-08-22
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2014-04-26
      • 2012-02-27
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多