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

К нашему сайту можно получить доступ из полнофункционального браузера, из мобильных браузеров и из пользовательского приложения для 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 ответа

Решение

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

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

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

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

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

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

@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
Другие вопросы по тегам