Django:动态表单生成(更改字段类型)

Django:动态表单生成(更改字段类型),django,django-forms,Django,Django Forms,我有一个定义特定字段类型的模型 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')

我有一个定义特定字段类型的模型

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':
       ...
我真的找了很多,但是我找不到像这样的东西。或者,也许,我这样做是完全错误的?请帮忙

编辑:

我在模型中做了一些更改(替换了类外字段并添加了三种潜在类型):

类ChoiceOnline管理字段类型。我需要一个类似这样的函数:如果它被选择为“整数”,那么让我们使用
ExtraIntegerField
,对吗?也许我不应该担心表格。。。我需要一个直接在模型中的函数


BIG感谢您的任何想法或帮助。

在我看来,几乎总有比动态模型字段更好的想法。 然而,也许此应用程序将帮助您或至少为您指明方向:


你说得对,还有其他方法。我不知道为什么我以前没想到。。。它被称为“陷入无止境的循环”。我ve提出了另一个解决方案:只是为字段类型(如ExtraTextField、ExtraURLField等)添加了必要的类,为每个字段类型创建了类AddText、AddURL(与ChoiceInline的内容相同,但有必要的参数)和编辑的类AdminForm。这么简单。我真的需要更多的经验。无论如何,谢谢你的帮助!
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)