Django管理内联表单中的Unique Together密钥验证错误

时间:2018-04-12 16:10:52

标签: django django-models django-forms django-admin

我有以下模型A,B和C的结构。

class A(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    name = models.CharField(_('Name'), max_length=40)
    ...
    ...


class B(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    a = models.OneToOneField(A, verbose_name=_('A'), on_delete=models.CASCADE)

class C(models.Model):
    id = models.IntegerField(primary_key=True, editable=False)
    a = models.ForeignKey(A, verbose_name=_('A'), on_delete=models.CASCADE)
    b = models.ForeignKey(B, verbose_name=_('A'), on_delete=models.CASCADE)
    name = models.CharField(_('Name'), max_length=40)
    number = models.IntegerField(_('Number'))
    created = models.ForeignKey(User, on_delete=models.CASCADE)
        class Meta:
        unique_together = ('b', 'name', 'number')

以下是C表的模型表格和表格内联管理员的代码。

class CForm(forms.ModelForm):
    class Meta:
        model = C
        exclude = ['created',]
        widgets = {
            'b': forms.HiddenInput,
        }

class CInline(admin.TabularInline):
    model = C
    form = CForm
    classes = ['collapse']
    fields = ('name', 'number', 'b', )
    readonly_fields = ('created', )
    extra = 0

    def has_delete_permission(self, request, obj=None):
        return False

之后我将CInline类注册为模型A的Admin中的内联,如下面的代码所示。

class AAdmin(admin.ModelAdmin):
    inlines = [B, CInline]

我能够在模型A的管理界面中看到内联部分并保存,但是当我打开它进行更改并单击保存按钮时,字段中有/没有任何更改它会引发验证错误C with this name, number and b already exists.

即使我们没有更改任何字段,我也不知道为什么它会在更改表单中引发验证错误。

如果我从内联中删除CInline,那么它正在按预期工作。

如何处理这种情况?

0 个答案:

没有答案