Django Добавление поля в модель - поле не отображается в форме
Я всю ночь искал ответ на этот вопрос, но, похоже, не могу найти в чем дело.
Я работаю над переносом пользовательской CMS на Django, и в основном она имеет следующую структуру:
- Запись имеет 1 макет
- Макет имеет много разделов
Таким образом, после того, как пользователь создает и ввод, когда они редактируют его, я хочу показать все разделы, которые включены в этот макет.
Поэтому я получаю идентификатор макета из записи, перебираю и получаю разделы и пытаюсь добавить их в форму.
Когда я его отлаживаю, похоже, что все отлично добавляется к объекту 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>}
Я вижу очевидную разницу в полях, которые я добавил, по сравнению с полями, которые уже были в модели: 'legacy_import': <django.forms.fields.TypedChoiceField object at 0x1c32c90>, 'section': <django.db.models.fields.CharField>,
но не уверен, как это исправить.
3 ответа
Нашел ответ.
https://code.djangoproject.com/ticket/12238
Видимо, есть ошибка с добавлением полей в ModelForms.
Применение изменения, найденного в комментариях по ссылке выше, к options.py, похоже, решило проблему, и теперь поля отображаются в форме.
Тем временем я решил эту проблему, обновив contrib / admin / 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()})]
Это форма, а не модель, поэтому вы хотите добавить поля формы, а не поля модели.
self.fields['section_%d' % section.id] = forms.CharField(max_length=200, label=section.section_label)
Скорее всего, если вы не определите первичный ключ в своей модели, тогда столбец с именем id или что-то в соответствии с вашей настройкой среды django будет автоматически создано как первичный ключ. или это может быть, если вы определили несколько столбцов в db напрямую, но для этого вам необходимо написать их отображение в модели django. чтобы увидеть вашу модель SQL просто перейдите в терминал и введите:
# python manage.py sql [appname]
Теперь для вас будет таблица sql, сгенерированная django. Таким образом, вы могли видеть столбцы.