如何在django模型中获得自动修改的字段?

时间:2014-03-27 19:52:20

标签: django django-forms django-models

假设我有一个模型User,其中有一个credits字段(IntegerField)。当用户注册时,我会将credits字段设置为0,我会针对某些事件更新credits

我不希望用户知道db表中有这样的字段。

我应该在该字段中设置什么属性?

2 个答案:

答案 0 :(得分:1)

要完成对0部分的默认,您只需使用模型字段的default参数。

对于您不希望用户了解该字段的部分,您有几个选择。

解决方案1:Field.editable

如下定义字段将导致该字段永远不会以模型形式显示。

credits = models.IntegerField(default=0, editable=False)

缺点

  1. 您无法在管理
  2. 中修改字段的值
  3. 表单验证永远不会考虑此字段(例如,def clean_credits(self):不会运行)
  4. 解决方案2:ModelForm.exclude|fields

    为模型创建ModelForm是您将要做的事情。您可以在表单的exclude类中定义Meta属性,并将"credits"添加到列表中。请参阅上面链接的文档。您可以在fields类上定义Meta,并省略"credits"。后两种选择被认为是一种更好的做法,特别是在与安全性有关时,被称为whitelist

    缺点

    1. 您必须记住在每个公开表单上定义excludefields
    2. 更新"秘密"字段

      处理指定"秘密"的正确方法当字段不在表单中时,字段的值为:

      # Inside your view's post method (or FormView.form_valid, if you're using generic views)
      instance = form.save(commit=False)  # Does everything except INSERT into the database
      instance.credits = <however many credits you feel like giving the user>
      instance.save()
      

      如果您没有这样做,而只是按原样保存表单,则default指定的值将设置为实例的credits字段。< / p>

答案 1 :(得分:0)

您需要使用默认值为0的IntegerField:credits = models.IntegerField(default=0)。请注意不要以任何形式或显示用户时向用户显示此字段。

例如,如果您ModelFormUser,请不要在credits的{​​{1}}字段中加入fields