Объект Django ModelFormSet меняет тип на пост - PullRequest
0 голосов
/ 05 февраля 2019

Я конвертирую страницу с использованием отображаемых вручную функций post / get в функцию с использованием представлений на основе классов.Я пытаюсь использовать все встроенные функции Django.Но я сталкиваюсь с запутанной ошибкой, когда объект ModelFormSet имеет неправильный тип при публикации формы.

У меня есть эта форма:

class AssignmentDatesForm(forms.ModelForm): 

class Meta:
    model = AssignmentDates
    fields = [
    'assignment_name',
    'start_date',
    'due_date',
    'end_date',
    ]

    widgets = { 'start_date' : forms.DateInput(format = '%m/%d/%Y', attrs ={ 'class' : 'datepicker'}),
                'due_date' : forms.DateInput(format = '%m/%d/%Y', attrs ={ 'class' : 'datepicker' }),
                'end_date' : forms.DateInput(format = '%m/%d/%Y', attrs ={ 'class' : 'datepicker' }),}

def clean(self):
    logging.warning("Clean function")
    logging.warning("start_date: " + str(start_date))
    logging.warning("due_date: " + str(due_date))
    logging.warning("end_date: " + str(end_date))
    # Actual validation logic here

И создайте ModelFormSet, используя modelformset_factory:

AssignmentDatesFormSet = forms.modelformset_factory(
model = AssignmentDates,
form = AssignmentDatesForm,
extra = 0,
) 

Вот представление, сокращенное для краткости:

class EditDueDates(CurrentUserMixin, ModelFormSetView):
model = AssignmentDates
page_title = 'Edit Due Dates'

success_message = "Dates updated successfully!"
add_button_title = "Add Button Title"
form = AssignmentDatesForm
formset = AssignmentDatesFormSet
template_name = "edit_due_dates.html"
sidebar_group = ['scaffold', 'edit_due_dates']

columns = [
    ('Assignment Name', 'assignment_name'),
    ('Start Date', 'start_date'),
    ('Due Date', 'due_date'),
    ('End Date', 'end_date'),
    ]

fields = [
'assignment_name',
'start_date',
'due_date',
'end_date',
]

show_context_menu = False

def get_context_data(self, **kwargs):
    context = super(EditDueDates, self).get_context_data(**kwargs)

    # Date retrieval/ DB storage logic here

    form = AssignmentDatesFormSet(queryset = AssignmentDates.objects.filter(created_by = creds.get_OUNetID()))
    logging.warning("get_context_data form type: " + str(type(form)))
    context['form'] = form
    return context

def formset_valid(self, formset):
    logging.warning("formset_valid form type: " + str(type(formset)))
    cleaned_data = formset.clean()
    if formset.is_valid():
        formset.save()            
    return super(EditDueDates, self).formset_valid(formset)

ModelFormSet отлично отображается в шаблоне, и сообщение о регистрации, которое я имею выше, печатает тип формы следующим образом:

 <class 'scaffold.forms.AssignmentDatesFormSet'>

Но моя функция очистки никогда не выполняется.Когда он выполняет функцию formset_valid, которую я имею в представлении, и распечатываю тип formset, я получаю это:

<class 'django.forms.formsets.AssignmentDatesFormFormSet'>

Так что он никогда не выполняет мою чистую функцию, потому что тип неправильный.Повторное выполнение formset.clean () просто выполняет чистую функцию этого странного типа.

Понятия не имею, почему это другой тип, когда он ВЫСТАВЛЕН из шаблона.Если у кого-то есть идеи, пожалуйста, дайте мне знать!Спасибо!

-Будет

...