Django: верните несколько видов из одного URL без перенаправления
-
09-09-2020 - |
Вопрос
с функциональным представлением 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
и выполнять переключение туда в соответствующий способ. подробные документы поправляются, но я все еще нашел Я покинул исходный код, чтобы выяснить, как выполнить то, что я хочу.