0

特定のフィールドの型を定義するモデルがあります

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か? たぶん、フォームについて心配する必要はありません...そして、ここでモデルに直接関数が必要ですか?

どんなアイデアや助けにも感謝します。

4

1 に答える 1

0

IMO、ほとんどの場合、動的モデル フィールドよりも優れたアイデアがあります。ただし、このアプリが役立つ、少なくとも方向性を示す場合があります。

https://github.com/dobarkod/django-dynamic-model

于 2013-08-20T16:04:54.603 に答える