ジャンゴ - モデルインスタンスビューをカウント(「トップエントリー」のためのアプリ)
-
23-08-2019 - |
質問
私は新しい、そして困惑しています。私は記事やブログモデルの両方の「トップヒット」のインスタンスを追跡してモジュールを作成します。私は記事やブログのモデルのコードに触れることをしたくありません。これは、ミドルウェアの候補ですか? HttpRequest.path
を見て?
解決
それはあなたが記事やブログ記事を表示するのに使用するURLパターンの詳細に依存性を紹介するようrequest.pathを見て
ミドルウェアは、醜いです。あなたはこの結合を気にしないならば、あなたにもちょうどパフォーマンスヒットを保存し、Webサーバのログファイルに分析を行う可能性があります。 (編集:ビューミドルウェアは、それが関係のない景色にはオーバーヘッドが発生しないよう、私はまだデコレータのアプローチを好むだろう。、より良い選択肢だろうが、あなたはのURLconfに触れることをしたくない場合は、ビューミドルウェアは働くだろうブログ/記事のアプリケーションの場合)。
私はあなたがobject_detailビュー(またはカスタム相当)を包み込むビューデコレータを使用すると思います。あなたはURLconfの中で直接ラッピングを行うことができます。このような何かます:
def count_hits(func):
def decorated(request, *args, **kwargs):
# ... find object and update hit count for it...
return func(request, *args, **kwargs)
return decorated
そして、あなたはviews.pyでそれを適用することができます:
@count_hits
def detail_view(...
やあなたのURLconfでます:
url(r'^/blog/post...', count_hits(detail_view))
他のヒント
あなたは、一般的なヒットモデルを作成することができます。
class Hit(models.Model):
date = models.DateTimeFiles(auto_now=True)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
あなたのview.pyにこの関数を記述します:
def render_to_response_hit_count(request,template_path,keys,response):
for key in keys:
for i in response[key]:
Hit(content_object=i).save()
return render_to_response(template_path, response)
あなたは見返りに興味を持っているビュー
return render_to_response_hit_count(request, 'map/list.html',['list',],
{
'list': l,
})
このアプローチはあなたに力を与え、ヒットをカウントするが、時間によってヒット歴史をフィルタリングするために、CONTENTTYPEのように...
だけでなく、ヒットの表は、急成長するかもしれませんが、あなたが削除戦略を考える必要があります。
所属していません StackOverflow