在管理模型中更新只读字段

时间:2011-12-08 11:30:21

标签: django admin readonly

我有一个包含两个日期字段的交易模型。第一个是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))

我在选定的日期添加了一天,如何获得其他字段的值?或者还有其他方法吗?

2 个答案:

答案 0 :(得分:1)

覆盖模型中的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了解有关此主题的更多信息。

答案 1 :(得分: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相同,也就是说你可以将它指向模型和模型管理员的属性,也可以指向callables和方法。< / p>