我在 models.py 中有一个具有自关系的模型:
from uuid import uuid4 from django.db
import models
class Example(models.Model):
uid = models.UUIDField(primary_key=True, default=uuid4)
title = models.CharField(max_length=128)
parent = models.ForeignKey("self", related_name="subexamples", blank=True, null=True)
和 Django 管理模型:
from .models import Example
from django.contrib import admin
class ExampleInline(admin.TabularInline):
model = Example
exclude = ("uid",)
extra = 1
verbose_name = "Subexample"
show_change_link = True
class ExampleAdmin(admin.ModelAdmin):
search_fields = ("title", )
exclude = ("uid",)
inlines = [ExampleInline,]
admin.site.register(Example, ExampleAdmin)
在管理站点上,我可以像在任何其他情况下一样看到主模型和内联模型。添加第一个内联对象后问题开始。添加后我无法再删除或更改它。我看到的唯一错误是“请更正下面的错误”。下面没有任何问题。 Django 日志中也没有任何问题。 我正在使用 Django==5.0.2
在阅读了类似问题后,我发现自定义 PK 破坏了逻辑,但实际上没有找到解决此问题的任何解决方法。
Django 的内联表单似乎不能很好地处理
exclude
主键。我设法复制了这种行为。
editable=False
[Django-doc] 来解决这个问题,这实际上意味着这些字段在 ModelForm
中不可编辑
,或者至少在没有明确添加它的情况下不会。这对于作为主键的 UUIDField
来说是有意义的,因为您让系统定义 UUID,而不是用户:这也是(我认为)您选择 exclude = ('uid',)
的原因。由于某种原因,这不能很好地工作,但我们可以在模型层中执行此操作:
class Example(models.Model):
uid = models.UUIDField(primary_key=True, default=uuid4, editable=False)
title = models.CharField(max_length=128)
parent = models.ForeignKey(
'self', related_name='subexamples', blank=True, null=True
)