Django: верните несколько видов из одного URL без перенаправления

StackOverflow https://stackoverflow.com/questions/6087043

Вопрос

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

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

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

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/")
.

Любые предложения?

Это было полезно?

Решение

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

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)
.

Другие советы

Даже если Django Docs скажем, что на основе функции Общие взгляды теперь устаревают , я думаю, что единственная причина переключиться, если вы пишете меньше кода.

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

Например,

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_queryset|get_context_data|get_object|get_template_names и выполнять переключение туда в соответствующий способ. подробные документы поправляются, но я все еще нашел Я покинул исходный код, чтобы выяснить, как выполнить то, что я хочу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top