2012-04-06 33 views
0

我有一个Django模型的扑救,这是令人难以置信的简单:Django的:拒绝模型基于特定标准

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

我要否认这种模式如果实际名称更改的储蓄,但我想允许更改大写。因此,例如:

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

我如何重写我的人模型的save()方法,使这样的编辑被拒绝?特别是,我正在努力:

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

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

回答

0

我会用一个表格,并在“干净”的方法,一些自定义的验证:

例如:

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 
+0

一个很好的答案,谢谢,但我真的想在模型级别强制执行此操作,而不是在特定的表单上执行此操作。 – 2012-04-06 19:43:07

1

This answer有两个很好的方法来检测一个字段是否已经改变,做一些事情。

在你的情况下,你会修改它不仅检测一个字段是否发生了变化,而且还检测它是否是你想要允许的变化。

+0

谢谢,其中一个答案真的很好。你知道有什么方法可以从'save()'方法传回一个好消息给用户界面吗?它看起来不像可以在Django中使用内置消息,因为您无法访问'request'对象。 – 2012-04-06 19:57:37

+0

@Sam'save()'可以在没有请求的情况下被调用,例如在Python shell中,它不适合在'save'中访问请求的地方。 – okm 2012-04-07 06:09:17