自定义主键破坏了 Django 管理内联逻辑

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

我在 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 django-admin django-inline-models
1个回答
1
投票

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
    )
© www.soinside.com 2019 - 2024. All rights reserved.