【问题标题】:Updating Readonly Field In Admin Model更新管理模型中的只读字段
【发布时间】:2024-07-22 20:15:02
【问题描述】:

我有一个包含两个日期字段的交易模型。第一个是 start_date,另一个是 end_date。我的目标是当我保存交易时,我想更新一个只读字段,该字段显示这两个 date_field 的减法。

我尝试编写一个小部件,但是我只能获得其中一个字段。这是我的小部件:

class DueToWidget(AdminDateWidget):                                                                                                                                                                        
    def render(self,name,value,attrs=None):                                                                                                                                                                
        from datetime import timedelta                                                                                                                                                                     
        output = []                                                                                                                                                                                        
        output.append(super(AdminDateWidget, self).render(name,value,attrs))                                                                                                                               
        if value:                                                                                                                                                                                          
            due_to = value + timedelta(days=1)                                                                                                                                                             
            output.append(u'<p>Diff : %s</p>' % due_to)                                                                                                                                   

        return mark_safe(u''.join(output))

我在选定的日期上加了一天,我怎样才能得到另一个字段的值?或者有没有其他方法可以做到这一点?

【问题讨论】:

    标签: django admin readonly


    【解决方案1】:

    如果您不介意必须刷新才能看到差异(也就是说,您只有在保存模型后才能看到它),那么更简单的方法是在管理员中添加一个只读字段,它指向一个函数,像这样:

    class MyModelAdmin(ModelAdmin):
        readonly_fields = ('dates_difference',)
    
        #add your other fields, or put it in a fieldset
        fields = ('dates_difference',)
    
        def dates_difference(self, model_instance):
            return model_instance.end_date - model_instance.start_date
    

    由于您的目标只是在模型的管理中显示额外信息,因此这里是放置代码的地方,而不是在字段的小部件或模型的类中。

    正如readonly_fields documentation 所指定的,它的行为与list_display 几乎相同,也就是说,您可以将其指向模型和模型管理员的属性,也可以指向可调用对象和方法。

    【讨论】:

    • 谢谢!这正是我想要的
    【解决方案2】:

    覆盖模型中的save() 以保存计算数据。

    def save( self, *args, **kw ):
        self.diff = self.end_date - self.start_date
        return super( YourModelClass, self ).save( *args, **kw )
    

    通过reading the Django documentation 了解有关该主题的更多信息。

    【讨论】: