如何设置只读字段的初始值

如何设置只读字段的初始值

问题描述:

我有一个django应用程序正在使用django.contrib.admin进行管理任务。如何设置只读字段的初始值

对于一个模型,我现在需要添加一个字段,指示每行的创建源代码的哪一部分。我使用readonly_fields来防止通过管理界面更改此值。

在此字段的默认值会告诉我该行是之前被引入该领域

  • 通过代码尚未更新设置通过创建领域
  • 创建

    • 创建管理界面

    但我需要更好的粒度比。特别是我希望能够区分由不知道该字段的代码创建的行和通过管理界面创建的行。

    有什么方法可以让我的ModelAdmin类为readonly_fields中提到的字段指定初始值?

  • +0

    有一个构造函数?这就是您可以将其设置为大多数其他语言的地方。 – Mark

    +0

    @Mark我可以向类中添加构造函数,但构造函数如何知道它是否从'django.contrib.admin'调用? – kasperd

    我发现这个解决方案,这似乎工作:

    class Admin(ModelAdmin): 
        readonly_fields = ('created_by',) 
        def save_form(self, request, form, change): 
         r = super(Admin, self).save_form(request, form, change) 
         if not change: 
          assert r.created_by == CREATED_BY_UNKNOWN 
          r.created_by = CREATED_BY_ADMIN 
         return r 
    

    CREATED_BY_UNKNOWNCREATED_BY_ADMIN都在我的代码的其他地方定义的值。要做到这一点

    +0

    覆盖'save_model'可能会稍微好一点,因为这似乎是[文档化的方法](https://docs.djangoproject.com/zh/1.10/ref/contrib/admin/#django.contrib.admin。 ModelAdmin.save_model)来达到预期的效果。 –

    +0

    @JoshuaPokotilow已经过去了一年半了,我不再记得在提出我的解决方案之前我尝试了哪些方法。所以我不能告诉你使用'save_model'是否由于某种原因被测试和丢弃。我可以告诉你,我提出的解决方案是有效的,据我所知,它仍在使用,从未造成任何问题。 – kasperd

    +0

    我不怀疑你的方法有效。只是指出一个可能更有前途的替代方案。我没有看到'save_form'记录在任何地方,所以Django有可能会在某一天停止调用它。除非有特别定制的东西,否则没有理由认为'save_model'不会像Django 1.6或更高版本中的'save_form'那样工作,至少考虑到所提出的问题/建议的解决方案。 –

    的一种方法是,

    def get_form(self, request, caja=None, **kwargs): 
        self.form = YourModelForm 
    
        form = super(YourModelAdmin, self).get_form(request, caja, **kwargs) 
        form.base_fields['field'].initial = your_initial_data 
        return form