2012-06-05 109 views
0

我一直在寻找整夜寻找答案,但似乎无法找到问题所在。Django添加一个字段到模型 - 字段不显示在窗体上

我的工作移植自定义CMS以Django的,基本上具有以下结构:

  • 中的一个条目1布局
  • 布局有许多部分

所以后用户创建并输入,当他们编辑它时,我想显示该布局中包含的所有部分。

所以我从入口获取布局ID,通过循环而得到的部分,并试图将它们添加到窗体。

当我调试它,它看起来像被添加的一切对象的字段就好了,但它并没有在表格上显示,除非我预定义的领域,这会破坏目的

我有随后的几个例子在这里和已经得到这个代码:

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>} 

我可以看到obvi我添加的字段与已经在 模型中的字段有所不同:'legacy_import': <django.forms.fields.TypedChoiceField object at 0x1c32c90>, 'section': <django.db.models.fields.CharField>, 但不确定如何解决此问题。

+0

迪迪ü手动添加的领域在数据库中....... ..? – user1409289

+0

该字段位于数据库中,但不在该模型中。这是另一种模式。 – Jimmy

+0

我将不得不编写自定义保存功能,但需要在表格 – Jimmy

回答

1

找到了答案。

https://code.djangoproject.com/ticket/12238

显然有与添加字段ModelForms的错误。

应用在链接的上面options.py评论中发现的变化似乎已经解决了这个问题,并在字段现在显示在表格上。

我已经解决了这个在此期间通过更新的contrib /管理/ options.py :

def get_fieldsets(self, request, obj=None): 
    "Hook for specifying fieldsets for the add form." 
    if self.declared_fieldsets: 
     return self.declared_fieldsets 
    #form = self.get_form(request, obj) 
    #return [(None, {'fields': form.base_fields.keys()})] 
    form = self.get_form(request, obj)(instance=obj) 
    return [(None, {'fields': form.fields.keys()})] 
0

机会可能是,如果你没有在你的模型中定义主键,然后根据你的名为id或东西列Django的环境设置将自动作为主键来创建。或者它可能是,如果你直接在db中定义一些列,但要做到这一点,你需要在django模型中编写它们的映射。看到你的模型SQL只是去终端和输入:

# python manage.py sql [appname] 

现在将有由django为您生成的表sql。所以你可以看到专栏。

+0

上使用此额外信息使用manage.py创建表。获取所有额外数据的循环工作正常,当我调试时,我可以看到它正在抓取的部分,并添加到self.fields对象中。只是在表单呈现时不显示。 – Jimmy

2

这是一个表单,而不是一个模型,所以你想添加表单字段,而不是模型字段。

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

先试了一下。只是因为我认为它可能需要与已添加的类型相同,才将其改为模型。 – Jimmy

+0

只需将其切换回来并显示相同的结果,不在窗体上显示,不会出现错误,调试表明它仅添加到窗体上 – Jimmy

相关问题