Как мои представления Django могут узнать, какой шаблон отображать или нужно ли возвращать JSON? - PullRequest
4 голосов
/ 07 февраля 2010

К нашему сайту можно получить доступ из полнофункционального браузера, из мобильных браузеров и из пользовательского приложения для iPhone.Поскольку логика в основном одинакова независимо от клиента, мы используем одни и те же представления для обработки всех типов запросов.Но в нижней части каждого из наших представлений есть что-то вроде:

if request.is_mobile():
    return render_to_response('foo/bar/baz_mobile.html', context)
elif request.is_api():
    return json.dumps(context)
else:
    return render_to_response('foo/bar/baz.html', context)

Очевидно, что есть лучший способ сделать это:)

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

Как бы вы это сделали?

Ответы [ 3 ]

3 голосов
/ 07 февраля 2010

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

1 голос
/ 07 февраля 2010

Игнасио Васкес-Абрамс прав.

Как вы сказали, логика в основном та же самая, но логика - это не видение. Согласно оригинальной статье MVC: «представление - это (визуальное) представление своей модели». Таким образом, у вас должны быть разные представления для разных целей и общая логика.

0 голосов
/ 04 февраля 2011

Как описано здесь:

http://docs.djangoproject.com/en/dev/ref/request-response/#attributes

Таким образом, включая аргумент запроса из вашего представления в контекст вашего шаблона:

@auto_render
def base_index(request, template_name="desktop-home.html") :
  user_agent = request.META["HTTP_USER_AGENT"]
  if "mobile" in user_agent :
    template_name = "mobile-home.html"

  return template_name, {
    "Navigation" : NavigationManager.db,
    "Headers"    : request
  }

Обеспечивает таким образом в вашем шаблоне:

{{ Headers.META.HTTP_USER_AGENT }}

Какие отчеты:

Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Ubuntu/10.04 Chromium/8.0.552.237 Chrome/8.0.552.237 Safari/534.10
...