在 django-admin 中更新记录的问题

Posted

技术标签:

【中文标题】在 django-admin 中更新记录的问题【英文标题】:Problems with updating records in django-admin 【发布时间】:2010-12-18 01:05:13 【问题描述】:

我正在使用 Django(特别是 django-admin)作为网站的管理面板,该网站使用 php 提供面向客户端的功能。我一直在搞乱让管理员看起来完全符合我想要的方式,到目前为止一切都很好。但是,我遇到了一些需要解决的问题。

这是我正在使用的模型:

class Permissions(models.Model):
    id = models.IntegerField(primary_key=True)
    league_key = models.CharField(max_length=15) 
    commissioner_id = models.ForeignKey(Accounts, db_column='commissioner_id',
                                        to_field='id')
    status = models.IntegerField()
    key = models.CharField(max_length=50)
    publisher_key = models.CharField(max_length=25)
    publisher_display_name = models.CharField(max_length=50)
    base_league = models.ForeignKey('self', db_column='id')
    share = models.IntegerField()
    default_fixture_key = models.CharField(max_length=50)

    def __unicode__(self):
        return self.publisher_key + ' / ' + self.league_key

    class Meta:
        db_table = u'permissions'
        verbose_name = 'Permissions'
        verbose_name_plural = 'Permissions'

class PermissionsAdmin(admin.ModelAdmin):
    list_display = ('league_key', 'publisher_key', 'commissioner_id', 'status',
                    'base_league', 'share', 'default_fixture_key')
    list_display_links = ('league_key','commissioner_id', 'base_league')
    exclude = ('id',)

第一个问题是用于编辑现有记录的管理表单将其中一个字段标记为必填项。我如何告诉 django-admin 何时需要和不需要字段?

我遇到的第二个问题是,当我告诉它保存此记录时,我收到以下错误:重复键值违反唯一约束“permissions_pkey”。这让我认为 Django 没有进行更新,它正在尝试进行 INSERT

我还想到这可能是与 Postgresql 相关的问题。 permissions_pkey 是对该表的约束,用于跟踪用于自动增加该表的 id 的序列

虽然 Django 文档很棒,但他们似乎没有我需要的信息来解决这个问题。

(编辑:深入堆栈跟踪,我发现了这个很棒的小金块:

sql 
'UPDATE "permissions" SET "league_key" = E\'l.1258472565 \', "commissioner_id" = 7,
 "status" = 0, "key" = E\'cfcd208495d565ef66e7dff9f98764da \', 
"publisher_key" =     E\'chrishartjes.com \', 
"publisher_display_name" = E\'Chris Hartjes Free Press \', 
"id" = 744, "share" = 0, 
"default_fixture_key" = E\'\' WHERE "permissions"."id" = 745 '

这让我认为我自己的小 ForeignKey 条目导致了问题)

【问题讨论】:

我已编辑您的问题并删除了所有 html 标记。请问class Meta的缩进是否正确? 【参考方案1】:

问题 1:请参阅有关设置 nullblank 的文档。小故事:设置null 将允许数据库存储空值。您在这里想要的(很可能)是将blank 设置为True,以便在验证模型时不需要该字段。如果该字段不是 CharField,您还应该将 null 设置为 True。在此处查看文档:http://docs.djangoproject.com/en/dev/ref/models/fields/#field-options

问题 2:我相信您在这里想要的是 AutoField,而不是 IntegerField。不同之处在于 AutoField 会在保存新对象时自动为您创建一个新 id。在此处查看文档:http://docs.djangoproject.com/en/dev/ref/models/fields/#autofield

编辑:(来自我的评论)再看一遍,我发现错误引用了permissions_pkey。尝试用pkey = AutoField(primary_key=True) 替换id 字段。

【讨论】:

为有问题的字段添加了空白=真,现在它工作得很好。更改为 AutoField 似乎没有解决报告 pkey 错误的问题,并且我也删除了 exclude('id',) 行。 :( 您需要在更改为 AutoField 后删除并重新创建表。事实上,我建议完全省略 id 字段 - 如果你这样做,Django 会自动添加它。 我无法删除并重新创建表格,因为它充满了工作数据 既然您提到现有数据,可能值得查看托管模型 (docs.djangoproject.com/en/dev/ref/models/options/#managed),尽管我认为您的问题与此无关。 再看一遍,我发现错误引用了permissions_pkey。尝试用pkey = AutoField(primary_key=True) 替换id 字段。【参考方案2】:
    在字段上,如果不需要该字段,则将null=True 放入字段构造函数中。编辑:评论者说blank=True——他可能是对的——我面前没有文档。 如果 ID 为空,则执行插入,如果 ID 有值,则执行更新。不确定您所说的保存发生在哪里,但该信息可能会有所帮助。 (有一个已删除的答案指出 exclude('id') 可能导致了这个问题——我认为这也是正确的)

另外,我同意这些文档。如果您可以阅读 python,我强烈建议您尝试阅读您想要了解的领域的 Django 源代码。源代码是我读过的最好的、最易读的源代码。我从来没有遇到过只是跳进去阅读它的问题——它几乎和文档一样好。

【讨论】:

blank=True 将使字段不需要。 null=True 仅影响数据库中空白字段允许的空值;它不影响验证【参考方案3】:

    null=True,空白=True

    您不需要在权限模型中明确包含“id”列,我相信这是导致您的第二个问题的原因。

【讨论】:

以上是关于在 django-admin 中更新记录的问题的主要内容,如果未能解决你的问题,请参考以下文章

Django学习笔记(现学现写,实时更新)

如何使用 ajax 在 Django-admin 表格内联中读取/写入输入字段?

Django-admin:如何在记录更改列表中显示指向对象信息页面的链接而不是编辑表单?

Django-Admin 面板不会显示插入的记录抛出 phpmyadmin?

如何在django-admin中隐藏特定记录的字段?

在 Abinitio 的更新表组件中再次传递现有记录以进行更新