【问题标题】:Django custom save throws 50x instead of duplicate key errorDjango 自定义保存抛出 50x 而不是重复键错误
【发布时间】:2015-02-17 16:46:28
【问题描述】:

我有一个 Django 模型,我想在自定义保存时自动填充另一个字段的 md5。 它工作正常,直到在管理员中输入重复值,我得到一个 50 倍的错误,而不是一个重复的错误消息。我希望 md5 字段上的 unique=True 能够检查并捕捉到这一点。相反,我得到了数据库唯一约束错误。感觉就像我错过了一些明显的东西,但很困惑。有没有比保存更高的地方我应该检查这个?尝试了 pre_save 信号,但结果相同。

class MailList(models.Model):
    email = models.CharField(max_length=400, null=False, blank=False)
    md5 = models.CharField(max_length=32, null=False, blank=True, unique=True)

    def save(self, *args, **kwargs):
        self.md5 = md5(self.email.strip().encode('UTF-8').lower()).hexdigest()
        super(MailList, self).save()

class MailListAdmin(admin.ModelAdmin):
    readonly_fields = ('date_entered', 'date_modified', )
    list_display = ('email',
                    'date_entered', 'date_modified', 'md5',
                    'subscriber', )
    save_on_top = True
    search_fields = ['email', ]

admin.site.register(MailList, MailListAdmin)

【问题讨论】:

    标签: django validation model save


    【解决方案1】:

    您是否在管理视图中排除了 md5 字段?这可能是您的问题,因为 md5 没有在您的视图中检查唯一性,它会引发 50x 错误。 如果是这种情况,您可以为您的 ModelAdmin 使用自定义表单并检查那里的 md5 字段。

    【讨论】:

    • md5 确实出现在管理员中。编辑了原始问题以显示管理员配置。
    • 对不起,我的错;这不是排除字段,因为您在保存方法中设置值。
    • 不过,您可以使用自定义表单并在其 clean 方法中生成您的 md5 并在那里捕获错误,而不是在 save 方法中进行。
    • 谢谢,我以前没有做过自定义管理表单。这个 StackOverflow 对添加自定义表单有很好的指导:stackoverflow.com/questions/10040442/…
    • 并且为了澄清,为了插入数据以便唯一检查将自动起作用,数据需要插入到表单的 init 部分:stackoverflow.com/questions/7117012/…
    猜你喜欢
    • 2015-06-11
    • 2018-07-19
    • 2018-03-14
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多