社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

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

Community wiki • 1 年前 • 320 次点击  

我有一个 模型 wich定义某些字段的类型

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)

所以这是一个有类型选择的字段。

我还有一节课 型号.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)

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

大的 谢谢你的任何想法或帮助。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/157206
 
320 次点击  
文章 [ 1 ]  |  最新文章 1 年前