Django 管理者バックエンドのフォーム フィールドを作成しようとしています。データベースでは、CharField フィールドである必要があり、長さ 24*7 の "0" と "1" の値が含まれます。管理パネルでは、それぞれ 24 個のチェックボックスを持つ 7 つのフィールドとして表示したいと考えています。コード:
model.py:
from django.db import models
from places.widgets import *
from places.fields import *
class Place(models.Model):
…
time = HoursWorkByWeekField()
…
fields.py
from django.forms import fields
from django.db import models
from places.widgets import HoursWorkByWeekWidget
class HoursWorkByWeekField(models.CharField):
widget = HoursWorkByWeekWidget
def __init__(self):
super(HoursWorkByWeekField, self).__init__(max_length=24*7, min_length=24*7)
def to_python(self, value):
return list(value)
def get_db_prep_value(self, value):
result = []
for i in range(24*7):
if value[i] :
result += ['1']
else :
result += ['0']
return ''.join(result)
widgets.py
from django.forms import widgets
class HoursWorkByDayWidget(widgets.CheckboxSelectMultiple):
def render(self, name, attrs=None):
choices = range(0,24,1)
return widgets.CheckboxSelectMultiple.render(self, name, attrs, choices)
class HoursWorkByWeekWidget(widgets.MultiWidget):
def __init__(self, attrs=None):
widgets = (
HoursWorkByDayWidget(),
HoursWorkByDayWidget(),
HoursWorkByDayWidget(),
HoursWorkByDayWidget(),
HoursWorkByDayWidget(),
HoursWorkByDayWidget(),
HoursWorkByDayWidget(),
)
super(HoursWorkByWeekWidget, self).__init__(widgets, attrs)
syncdb を実行しようとすると、次のエラーが発生します。
TypeError: Error when calling the metaclass bases unhashable type: 'dict'