4

当サイトには、フルブラウザ、モバイルブラウザ、カスタム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)

明らかにそれを行うためのより良い方法があります:)

ビューにコンテキストディクショナリを返してもらい、応答のレンダリング方法を決定するデコレータでそれらをラップすることを考えました。あるいは、クラスベースのビューでできることがあるかもしれません。

どうしますか?

4

3 に答える 3

3

dictを返す関数があり、次に2つのビューがあります。1つはJSONとしてエンコードし、もう1つはテンプレートを介してそれを表示します。

于 2010-02-07T06:09:20.200 に答える
1

イグナシオ・バスケス=エイブラムスは正しい。

あなたが言ったように、ロジックはほとんど同じですが、ロジックはビューではありません。元の MVC ペーパーによると、「ビューはそのモデルの (視覚的な) 表現です」。したがって、同じロジックを共有して、目的ごとに個別のビューを用意する必要があります。

于 2010-02-07T07:10:33.973 に答える
0

ここで説明されているように:

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

したがって、ビューからテンプレートのコンテキストに request 引数を含めます。

@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
于 2011-02-04T14:12:24.930 に答える