2012-10-07 15 views
1

我想在運行時將方法添加到我的django模型,以便通過管理界面查看。 Sense:用戶應該能夠添加CalculationRule,並且應用的規則會出現「虛擬」表。Django在運行時添加模型方法

# model.py 
from django.db import models 
import types 

def rule(self): 
    return 12 * self.calorific_requirement 

class BuildingTable(models.Model): 
    building_nr = models.IntegerField() 
    square_meter = models.FloatField() 
    calorific_requirement = models.FloatField() 

    @staticmethod 
    def __new__(cls, *args, **kwargs): 
     setattr(cls, "rule", types.MethodType(rule, cls)) 
     return models.Model.__new__(cls, *args, **kwargs) 

    def reqirement_per_m2(self): # this is also a rule! 
     return self.calorific_requirement/self.square_meter 

    def __unicode__(self): 
     return "Building " + str(self.building_nr) 

class CalculationRule(models.Model): 
    name = models.CharField(max_length=200) 
    rule = models.CharField(max_length=200) 

    def __unicode__(self): 
     return str(self.name) 

但如果我加上 「規則」 對我admin.py它提出BuldingTableAdmin.list_display[4], 'rule' is not a callable or an attribute of 'BuldingTableAdmin' or found in the model 'BuildingTable'.

# admin.py 
from calccols_app.models import BuildingTable, CalculationRule 
from django.contrib import admin 

class BuldingTableAdmin(admin.ModelAdmin): 
    list_display = ["building_nr", "square_meter", "calorific_requirement", "reqirement_per_m2", "rule"] 

admin.site.register(BuildingTable, BuldingTableAdmin) 
admin.site.register(CalculationRule) 

我在Django的外殼測試BuildingTable;方法存在,但不能正常工作。任何想法如何我可以注入方法,以便Django可以處理/註冊它們?

回答

1

您不需要在模型中創建字段以將其顯示在管理員中。您可以在ModelAdmin實體中執行此操作。

class UserAdmin(admin.ModelAdmin): 
    list_display = ['username', 'fullname'] 

    def fullname(self, model): 
     return model.first_name + " " + model.second_name 

儘管我們可以動態地向模型添加一個方法。但你必須把它作爲一種方法,而不是財產:

def _status(invite): 
    if invite.is_activated: 
     return "Activated" 
    if invite.is_alive: 
     return "Live" 
    return "Expired" 

_status.short_description = 'status' 
Invite.status = _status # Invite is model class 

這個「屬性」通常顯示在管理和Django模板。

+0

這幫了我!準備就緒後,我會發布我的解決方案。 – Themerius