1

実行時にdjangoモデルにメソッドを追加して、admin-interfaceを介して表示できるようにします。センス:ユーザーはCalculationRuleを追加できる必要があり、適用されたルールで「仮想」テーブルが発生します。

# 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)

私はBuildingTabledjangoのシェルでテストしました。-メソッドはrule存在しますが、正しく機能しません。djangoがメソッドを処理/登録できるように、メソッドを注入する方法について何かアイデアはありますか?

4

1 に答える 1

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

この「プロパティ」は通常、adminおよびDjango-templatesに表示されます。

于 2012-10-07T14:57:37.833 に答える