【问题标题】:Django: Denying model saves based on particular criteriaDjango:根据特定标准拒绝模型保存
【发布时间】:2012-04-06 18:07:26
【问题描述】:

我有一个 Django 模型,非常简单:

class Person(models.Model):
    name = models.CharField(max_length=100)

如果实际名称发生更改,我想拒绝保存此模型,但我想允许更改大小写。比如:

SAM -> sAm: allowed
Sam -> SAM: allowed
Sam -> John: not allowed

如何覆盖我的 Person 模型的 save() 方法,以便拒绝此类编辑?特别是,我正在努力:

  1. save() 方法中访问对象的预保存版本。
  2. 当保存被拒绝时,在 Django 的管理区域内向用户显示一条消息。
  3. 当保存被拒绝时让用户返回编辑屏幕。

请随意回答问题的任何部分,提前致谢!

【问题讨论】:

    标签: python django


    【解决方案1】:

    This answer 有两种很好的方法来检测一个字段是否发生了变化并做一些事情。

    在您的情况下,您将对其进行修改,不仅可以检测字段是否已更改,还可以检测它是否是您想要允许的更改。

    【讨论】:

    • 谢谢,其中一个答案非常有效。你知道有什么方法可以通过save() 方法将漂亮的消息传递回用户界面吗?看起来您无法使用 Django 中的内置消息,因为您无权访问 request 对象。
    • @Sam save() 可以在没有 request 的情况下调用,例如在 Python shell 中,它不是在 save 中访问请求的正确位置。
    【解决方案2】:

    我会在“干净”方法中使用表单和一些自定义验证:

    示例:

    class MyForm(ModelForm):
        class Meta:
            model = MyModel
    
        def clean(self):
            cleaned_data = self.cleaned_data
            name = cleaned_data.get("name ")
            if name == ###:
                #custom validition checking here
                raise forms.ValidationError('You can only capitalize.')
            return cleaned_data
    

    【讨论】:

    • 一个很好的答案,谢谢,但我真的想在模型级别执行此操作 - 而不是在特定表单上。
    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 2019-01-02
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多