【问题标题】:Django: dynamic form generation (changing field type)Django:动态表单生成(更改字段类型)
【发布时间】:2013-08-18 07:02:33
【问题描述】:

我有一个模型,它定义了某些字段的类型

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 类并添加了三种潜在类型):

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)

Class ChoiceInline 管理字段类型。我需要一个这样的函数:如果选择“整数”,让我们使用ExtraIntegerField,对吗?也许我不应该担心表单......我需要直接在模型中使用函数?

非常感谢任何想法或帮助。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    IMO,几乎总是有比动态模型字段更好的主意。 然而也许这个应用程序会帮助你或至少给你方向:

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

    【讨论】:

    • 你是对的,说还有其他方法。 Dont know why I didnt 早点想到... Its called "to get caught in an endless loop". Ive 提出了另一个解决方案:只是为 ExtraTextField、ExtraURLField 等字段类型添加了必要的类,为它们中的每一个都制作了类 AddText、AddURL(具有相同的内容作为 ChoiceInline 但带有必要的参数)并编辑了类 AdminForm。很简单。我真的需要更多的经验。无论如何,谢谢你的帮助!
    猜你喜欢
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2012-02-11
    相关资源
    最近更新 更多