特定のフィールドの型を定義するモデルがあります
class FieldType(models.Model): #determines types of fields which are availiable to choose
EMAIL = 'E'
INTEGER = 'I'
STRING = 'S'
TEXT = 'T'
FIELD_TYPE_CHOICES = (
(EMAIL, 'E-mail'),
(INTEGER, 'Integer'),
(STRING, 'String'),
(TEXT, 'Text'),
)
type_of_field = models.CharField(max_length=1,
choices=FIELD_TYPE_CHOICES,
default=STRING)
def is_upperclass(self):
return self.type_of_field in (self.EMAIL, self.TEXT)
したがって、これはタイプの選択肢を持つフィールドです。
また、ユーザーが新しいフィールドを追加できるようにするmodel.pyのクラスもあります。
class ColumnHead(models.Model):
newfield = models.CharField(max_length=200, verbose_name='head')
def __unicode__(self):
return u'%s' % (self.newfield)
class ExtraField(models.Model):
add = models.ForeignKey(ColumnHead)
new_field_text = models.TextField(max_length=200, verbose_name='content')
def __unicode__(self):
return u'%s' % (self.new_field_text)
class ChoiceInline(admin.StackedInline):
model = ExtraField
extra = 1 # how many extra choices it could be
class AdminForm(admin.ModelAdmin):
fieldsets = [
('Head', {'fields': ['newfield']}),
]
inlines = [ChoiceInline]
コンセプトは、新しいフィールドに選択したタイプを持たせることです。
したがって、追加フィールドの動作を定義する関数を作成するだけです (私は推測します)。しかし、Django と Python の知識が乏しいため、自信がありません。どこに書くかわかりません (ビューかフォームかモデルか)。フォームにこのクラスのようなものが必要だと思いました:
class DynamicType(forms.Form):
if field.type == 'E':
and there must be some action...
elif field.type == 'I':
...
本当にいろいろ探しましたが、これといったものは見つかりませんでした。それとも、私のやり方は完全に間違っているのでしょうか? 助けてください。
編集:
ここでモデルにいくつかの変更を加えました (クラス ExtraField を置き換え、3 つの潜在的な型を追加しました)。
class ExtraTextField(models.Model):
add = models.ForeignKey(ColumnHead)
new_field_text = models.TextField(max_length=200, verbose_name='content')
def __unicode__(self):
return u'%s' % (self.new_field_text)
class ExtraIntegerField(models.Model):
add = models.ForeignKey(ColumnHead)
new_field_integer = models.IntegerField(max_length=200, verbose_name='content')
def __unicode__(self):
return u'%s' % (self.new_field_integer)
class ExtraDateField(models.Model):
add = models.ForeignKey(ColumnHead)
new_field_date = models.DateField(max_length=200, verbose_name='content')
def __unicode__(self):
return u'%s' % (self.new_field_date)
クラス ChoiceInline は、フィールド タイプを管理します。次のような関数が必要です。「整数」を選択した場合は、使用できますExtraIntegerField
か? たぶん、フォームについて心配する必要はありません...そして、ここでモデルに直接関数が必要ですか?
どんなアイデアや助けにも感謝します。