Это причина, почему я решительный противник проверки на уровне базы данных с такими вещами, как null = False. Создайте одну модель Post
со всеми полями, которые может иметь любой тип публикации, но не применяйте требования к модели (blank=True, null=True
).
Затем вместо этого проверьте, что в ваших формах требуется то или иное поле и т. Д., Особенно ModelForms при работе с администратором.
Если в одном случае требуется определенное поле, вы можете принудительно ввести его, используя:
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
if self.instance.source == 'first':
self.fields['poll'].required = True
Затем, чтобы показать только фактические поля, которые должны отображаться на основе источника, вы можете либо немного поработать с JavaScript, либо вы можете явно исключить их из администратора с помощью ModelAdmin.get_fieldsets()
. В основном процесс таков:
class MyModelAdmin(admin.ModelAdmin):
...
fieldsets = (
(None, { 'fields': ('common_field_1', 'common_field_2', 'common_field_3',),
)
poll_fieldsets = (
(None, { 'fields': ('common_field_1', 'common_field_2', 'common_field_3', 'poll',),
)
def get_fieldsets(self, request, obj=None):
if obj and obj.source == 'first':
return self.poll_fieldsets
else:
return super(MyModelAdmin, self).get_fieldsets(request=request, obj=obj)