Django: вернуть несколько просмотров с одного URL без перенаправления - PullRequest
2 голосов
/ 22 мая 2011

В представлении Django на основе функций было просто переключаться между несколькими видами в зависимости от условия, например, что-то вроде:

def base_view(request):
    if some_condition():
        return foo_view(request)
    else:
        return bar_view(request)

Я не могу найти простой способ сделать то же самое с новымоснованные на классе общие представления.Единственный способ, которым я могу придумать, - это перенаправить, чего я хотел бы избежать по разным причинам:

def base_view(request):
    if some_condition():
        return redirect(reverse("name_of_url_to_class-based_view_foo"))
    else:
        return redirect("/url_to_class-based_view_bar/")

Есть предложения?

Ответы [ 2 ]

6 голосов
/ 22 мая 2011

Это эквивалентно вашему примеру с представлениями на основе классов.

class FooView(View):
    pass

class BarView(View):
    pass

class BaseView(View):
    # staticmethod to avoid adding 'self' to the arguments
    foo_view = staticmethod(FooView.as_view())
    bar_view = staticmethod(BarView.as_view())

    def dispatch(self, request, *args, **kwargs):
        if some_condition():
            return self.foo_view(request, *args, **kwargs)
        else:
            return self.bar_view(request, *args, **kwargs)
1 голос
/ 22 мая 2011

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

Если вы по-прежнему настроены на переключение, вам необходимо сначала определить, какие представления или миксины на основе классов являются наиболее подходящими (один объект, несколько объектов, дата, формы и т. Д.).Если условное выражение использовалось для выбора функции, которая возвращает различные контекстные данные / шаблон для представления представлению, вы можете переместить условное выражение в переопределенное значение get_queryset|get_context_data|get_object|get_template_names в зависимости от вашего варианта использования.

Например,

def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super(BaseView, self).get_context_data(**kwargs)
    # Add in the publisher
    if some_condition():
        context['some_data'] = ...
    else:
        context['other_data'] = ...
    return context

Если все остальное терпит неудачу, и вы все еще решаете иметь представления на основе классов, вы, вероятно, также можете переопределить get(self, request, *args, **kwargs) и выполнить переключение там на соответствующийметод. подробные документы становятся лучше, но я все еще копался в исходном коде, чтобы выяснить, как добиться того, чего я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...