2020-01-05 12:37:51 +00:00
|
|
|
import swapper
|
2019-03-27 15:49:14 +00:00
|
|
|
from django import forms
|
2019-12-31 12:05:12 +00:00
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
2020-01-02 00:56:15 +00:00
|
|
|
Page = swapper.load_model('cms', 'Page')
|
2019-12-31 12:05:12 +00:00
|
|
|
Section = swapper.load_model('cms', 'Section')
|
2019-03-27 15:49:14 +00:00
|
|
|
|
|
|
|
class PageForm(forms.ModelForm):
|
|
|
|
class Meta:
|
|
|
|
model = Page
|
|
|
|
fields = '__all__'
|
|
|
|
|
2019-08-23 15:19:40 +00:00
|
|
|
class SectionForm(forms.ModelForm):
|
2020-01-02 00:56:15 +00:00
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
|
|
|
|
# Repopulate the 'choices' attribute of the type field from
|
|
|
|
# the child model.
|
|
|
|
self.fields['type'].choices = self._meta.model.TYPES
|
|
|
|
|
2019-12-31 12:05:12 +00:00
|
|
|
def save(self):
|
|
|
|
section = super().save()
|
2020-01-05 12:37:51 +00:00
|
|
|
|
|
|
|
# Explanation: get the content type of the model that the user
|
|
|
|
# supplied when filling in this form, and save it's id to the
|
|
|
|
# 'polymorphic_ctype_id' field. The next time the object is
|
|
|
|
# requested from the database, django-polymorphic will convert
|
|
|
|
# it to the correct subclass.
|
2019-12-31 12:05:12 +00:00
|
|
|
section.polymorphic_ctype = ContentType.objects.get(
|
|
|
|
app_label=section._meta.app_label,
|
|
|
|
model=section.type.lower(),
|
|
|
|
)
|
|
|
|
|
|
|
|
section.save()
|
|
|
|
return section
|
|
|
|
|
2019-08-23 15:19:40 +00:00
|
|
|
class Meta:
|
|
|
|
model = Section
|
|
|
|
exclude = ['page']
|
2020-01-05 12:37:51 +00:00
|
|
|
#field_classes = {
|
|
|
|
# 'type': forms.ChoiceField,
|
|
|
|
#}
|
|
|
|
|
|
|
|
# There is definitely a bug in Django, since the above 'field_classes' gets
|
|
|
|
# ignored entirely. Workaround to force a ChoiceField anyway:
|
|
|
|
type = forms.ChoiceField()
|