Python Django向模型添加字段-字段未显示在表单上

Python Django向模型添加字段-字段未显示在表单上,python,django,dynamic,django-cms,modelform,Python,Django,Dynamic,Django Cms,Modelform,我整晚都在寻找答案,但似乎找不到问题所在 我正在将定制CMS移植到Django,它基本上具有以下结构: 一个条目有1个布局 布局有许多部分 因此,在用户创建和输入后,当他们编辑它时,我希望显示该布局中包含的所有部分 因此,我从条目中获取布局ID,遍历并获取部分,并尝试将它们添加到表单中 当我调试它时,看起来所有的东西都被添加到fields对象中了,但是除非我预定义字段,否则它不会显示在表单上,这会破坏它的用途 我在这里遵循了几个示例,了解了以下代码: class EntryChangeFor

我整晚都在寻找答案,但似乎找不到问题所在

我正在将定制CMS移植到Django,它基本上具有以下结构:

  • 一个条目有1个布局
  • 布局有许多部分
因此,在用户创建和输入后,当他们编辑它时,我希望显示该布局中包含的所有部分

因此,我从条目中获取布局ID,遍历并获取部分,并尝试将它们添加到表单中

当我调试它时,看起来所有的东西都被添加到fields对象中了,但是除非我预定义字段,否则它不会显示在表单上,这会破坏它的用途

我在这里遵循了几个示例,了解了以下代码:

class EntryChangeForm(forms.ModelForm):

def __init__(self, *args, **kwargs):
    super(EntryChangeForm, self).__init__(*args, **kwargs)
    layout = Layout.objects.filter(id=self.instance.layout_id)
    layout_sections = Section.objects.filter(layout_id=layout)
    for section in layout_sections:
        self.fields['section_%d' % section.id] = models.CharField(max_length=200, verbose_name=section.section_label)
        current_section = Data.objects.filter(page_id=self.instance.id, section_id=section.id, content_table_id=2)
        if current_section:
            self.fields['section_%d' % section.id.initla] = current_section.text
        else:
            self.fields['section_%d' % section.id].initial = ""
调试和打印self.fields的示例

 {'layout': 
<django.forms.models.ModelChoiceField object at 0x1c30b50>, 
'uid': <django.forms.fields.IntegerField object at 0x1c30c50>, 
'url': <django.forms.fields.CharField object at 0x1c30cd0>, 
'url_301': <django.forms.fields.CharField object at 0x1c30d50>, 
'name': <django.forms.fields.CharField object at 0x1c30dd0>, 
'page_title': <django.forms.fields.CharField object at 0x1c30e50>, 
'meta_description': 
<django.forms.fields.CharField object at 0x1c30ed0>, 
'meta_keywords': <django.forms.fields.CharField object at 0x1c30f50>, 
'order_fld': <django.forms.fields.CharField object at 0x1c30fd0>, 
'user_id': <django.forms.fields.IntegerField object at 0x1c32090>, 
'author': <django.forms.models.ModelChoiceField object at 0x1c32110>, 
'date_active': <django.forms.fields.SplitDateTimeField object at 0x1c32210>, 
'date_added': <django.forms.fields.SplitDateTimeField object at 0x1c32290>, 'date_modified': <django.forms.fields.SplitDateTimeField object at 0x1c32390>, 'date_expires': <django.forms.fields.SplitDateTimeField object at 0x1c32490>, 'date_published': <django.forms.fields.SplitDateTimeField object at 0x1c32590>, 'is_active': <django.forms.fields.TypedChoiceField object at 0x1c32690>, 'hide_from_dropdown': <django.forms.fields.TypedChoiceField object at 0x1c32790>, 'is_featured': 
<django.forms.fields.TypedChoiceField object at 0x1c32810>, 
'in_sitemap': <django.forms.fields.TypedChoiceField object at 0x1c32890>, 
'admin_user_id': <django.forms.fields.IntegerField object at 0x1c32910>, 'show_large_photo': <django.forms.fields.TypedChoiceField object at 0x1c32990>, 'is_featured_on_homepage': <django.forms.fields.TypedChoiceField object at 0x1c32a10>, 'capitalize_first_letter': <django.forms.fields.TypedChoiceField object at 0x1c32a90>, 'display_share_box': <django.forms.fields.TypedChoiceField object at 0x1c32b10>, 'display_subscribe_box': <django.forms.fields.TypedChoiceField object at 0x1c32b90>, 'is_commenting_enabled': <django.forms.fields.TypedChoiceField object at 0x1c32c10>, 'legacy_import':
 <django.forms.fields.TypedChoiceField object at 0x1c32c90>, 
'section': <django.db.models.fields.CharField>, 
'section_3': <django.db.models.fields.CharField>, 
'section_2': <django.db.models.fields.CharField>, 
'section_4': <django.db.models.fields.CharField>}


{'layout': 
<django.forms.models.ModelChoiceField object at 0x1c30b50>, 
'uid': <django.forms.fields.IntegerField object at 0x1c30c50>, 
'url': <django.forms.fields.CharField object at 0x1c30cd0>, 
'url_301': <django.forms.fields.CharField object at 0x1c30d50>,
'name': <django.forms.fields.CharField object at 0x1c30dd0>, 
'page_title': <django.forms.fields.CharField object at 0x1c30e50>, 
'meta_description': <django.forms.fields.CharField object at 0x1c30ed0>, 
'meta_keywords': <django.forms.fields.CharField object at 0x1c30f50>, 
'order_fld': <django.forms.fields.CharField object at 0x1c30fd0>, 
'user_id': <django.forms.fields.IntegerField object at 0x1c32090>, 
'author': <django.forms.models.ModelChoiceField object at 0x1c32110>, 
'date_active': <django.forms.fields.SplitDateTimeField object at 0x1c32210>, 
'date_added': <django.forms.fields.SplitDateTimeField object at 0x1c32290>, 'date_modified': <django.forms.fields.SplitDateTimeField object at 0x1c32390>, 'date_expires': <django.forms.fields.SplitDateTimeField object at 0x1c32490>, 'date_published': <django.forms.fields.SplitDateTimeField object at 0x1c32590>, 'is_active': <django.forms.fields.TypedChoiceField object at 0x1c32690>, 'hide_from_dropdown': <django.forms.fields.TypedChoiceField object at 0x1c32790>, 'is_featured': <django.forms.fields.TypedChoiceField object at 0x1c32810>, 
'in_sitemap': <django.forms.fields.TypedChoiceField object at 0x1c32890>, 
'admin_user_id': <django.forms.fields.IntegerField object at 0x1c32910>, 'show_large_photo': <django.forms.fields.TypedChoiceField object at 0x1c32990>, 'is_featured_on_homepage': <django.forms.fields.TypedChoiceField object at 0x1c32a10>, 'capitalize_first_letter': <django.forms.fields.TypedChoiceField object at 0x1c32a90>, 'display_share_box': <django.forms.fields.TypedChoiceField object at 0x1c32b10>, 'display_subscribe_box': <django.forms.fields.TypedChoiceField object at 0x1c32b90>, 'is_commenting_enabled': <django.forms.fields.TypedChoiceField object at 0x1c32c10>, 'legacy_import': <django.forms.fields.TypedChoiceField object at 0x1c32c90>, 
'section': <django.db.models.fields.CharField>, 
'section_3': <django.db.models.fields.CharField>, 
'section_2': <django.db.models.fields.CharField>, 
'section_4': <django.db.models.fields.CharField>}
{'layout':
, 
“uid”:,
“url”:,
“url_301”:,
“名称”:,
“页面标题”:,
“元描述”:
, 
“meta_关键字”:,
“订单号”:,
“用户id”:,
“作者”:,
“活动日期”:,
“添加日期”:“修改日期”:“过期日期”:“发布日期”:“处于活动状态”:“从下拉列表中隐藏”:“是否具有特色”:
, 
“in_站点地图”:,
“管理员用户id:”、“显示大照片”、“主页上有没有特色”、“首字母大写”、“显示共享框”、“显示订阅框”、“是否已启用评论”、“旧版导入”:
, 
“部分”:,
“第3节”:,
“第2节”:,
“第四节”:
{'layout':
, 
“uid”:,
“url”:,
“url_301”:,
“名称”:,
“页面标题”:,
“元描述”:,
“meta_关键字”:,
“订单号”:,
“用户id”:,
“作者”:,
“活动日期”:,
“添加日期”:“修改日期”:“过期日期”:“发布日期”:“处于活动状态”:“从下拉列表中隐藏”:“是否具有特色”:,
“in_站点地图”:,
“管理员用户id:”、“显示大照片”、“主页上有没有特色”、“首字母大写”、“显示共享框”、“显示订阅框”、“是否已启用评论”、“旧版导入”,
“部分”:,
“第3节”:,
“第2节”:,
“第四节”:
我可以看到我添加的字段与已经添加的字段之间的明显差异 模型:
'legacy_import':,'section':,

但不确定如何更正此问题。

如果您没有在模型中定义主键,则名为id的列或符合django环境设置的列将自动创建为主键。也可能是直接在db中定义了一些列,但要做到这一点,需要在django模型中编写它们的映射。要查看模型sql,只需转到terminal并键入:

# python manage.py sql [appname]

现在将有django为您生成的表sql。所以您可以看到列。

如果您没有在模型中定义主键,那么名为id的列或符合django环境设置的列将自动创建为主键。也可能是直接在db中定义了一些列,但要做到这一点,需要在django模型中编写它们的映射。要查看模型sql,只需转到terminal并键入:

# python manage.py sql [appname]

现在将有django为您生成的表sql。因此您可以看到列。

这是一个表单,而不是模型,因此您希望添加表单字段,而不是模型字段

self.fields['section_%d' % section.id] = forms.CharField(max_length=200, label=section.section_label)

这是一个表单,而不是模型,因此您希望添加表单字段,而不是模型字段

self.fields['section_%d' % section.id] = forms.CharField(max_length=200, label=section.section_label)
找到了答案

显然,向模型表单添加字段时存在一个错误

将上面链接的注释中的更改应用到options.py似乎解决了这个问题,字段现在显示在表单上

同时,我通过更新contrib/admin/options.py解决了这个问题 在:

找到了答案

显然,向模型表单添加字段时存在一个错误

将上面链接的注释中的更改应用到options.py似乎解决了这个问题,字段现在显示在表单上

同时,我通过更新contrib/admin/options.py解决了这个问题 在:


你是否在数据库中手动添加了该字段……?该字段在数据库中,但不在该模型中。它在另一个模型中。我还必须编写自定义保存函数,但需要在表单上有此额外信息。我手动将该字段添加到数据库中……?该字段在数据库中,但不在该模型中。它在另一个模型中。我还必须编写自定义保存函数,但首先需要在表单上有这些额外的信息。我将其更改为model,只是因为我认为它可能需要与已添加的类型相同。只需将其切换回去,结果相同,没有显示在表单上,不会出错,调试显示它只是添加到表单上,而不是首先尝试的表单上。我将其更改为model,只是因为我认为它可能需要与已添加的类型相同。只需将其切换回,结果相同,没有显示在表单上,不会出错,调试显示它只是添加到formUsed manage.py上,而不是创建表。获取所有额外数据的循环工作正常,当我调试时,我可以看到它捕获并添加到self.fields对象的部分。只是在呈现表单时不显示。使用manage.py创建表。获取所有额外数据的循环工作正常,当我调试时,我可以看到它捕获并添加到self.fields对象的部分。只是在渲染窗体时不显示。