Каков хороший способ написать представление на основе классов django, которое отображает как объект на основе даты, так и форму?

Каков наилучший способ написания представления на основе классов, которое отображает объект на основе даты и форму? Вариант использования - представление страницы индекса сайта, которое отображает сегодняшний объект и имеет контактную форму.

Сначала я подумал об использовании TodayArchiveView и ContactFormView в качестве миксинов для просмотра моей страницы индекса сайта. Однако TodayArchiveView наследуется от BaseDateListView, а ContactFormView наследуется от ProcessFormView. И ProcessFormView, и BaseDateListView реализуют get() и в конечном итоге вызывают render_to_response с очень разными данными, поэтому я думаю, что это не сработает, потому что, даже если бы я мог вызвать оба с помощью super, что будет возвращено? (Я даже не уверен, что мои мысли об этом верны; я все еще оборачиваюсь многовариантным наследием.)

Затем я подумал о написании собственного get(), который сочетает в себе функциональность двух get, поскольку, насколько я могу судить, их функциональность не конфликтует. Так что в итоге выглядело так:

def get(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    form = self.get_form(form_class)

    self.date_list, self.object_list, extra_context = self.get_dated_items()
    context = self.get_context_data(form=form, object_list=self.object_list,
        date_list=self.date_list)
    context.update(extra_context)
    return self.render_to_response(context)

Это правильный подход?

В качестве более крупного вопроса, как вы узнаете, какие миксины можно использовать друг с другом? Мне пришлось обратиться к исходному коду django, чтобы понять, что оба класса реализуют get().

1 ответ

Решение

Ваша форма связана с объектом или нет? Из описания кажется, что это не так, и я предполагаю, что ваша контактная форма находится в какой-то боковой панели или подобном элементе всего сайта (или, по крайней мере, всего раздела).

Если это правильно, я бы вообще не включал форму в представление; вместо этого я бы использовал тег, включаемый или подобный метод для размещения отдельно определенного шаблона.

Другие вопросы по тегам