3

Webアプリケーションを構築していますが、request.userがムービーを作成したユーザーと一致することを確認する際に多くの複製があることがわかりました。ムービーにはユーザーに対するFKがあるため、特定のムービーを作成したユーザーのみが適切なアクションを実行できます。

@login_required
def edit_movie(request, slug, template_name="movies/edit_movie.html"):
    movie = get_object_or_404(Movie, slug=slug)
    if movie.user != request.user:
        raise HttpResponseForbidden
    # Rest of code omitted for brevity.

@login_required
def edit_screener(request, slug, template_name="movies/edit_screener.html"):
    movie = get_object_or_404(Movie, slug=slug)
    movie_media = movie.moviemedia_set.get(movie_type='screener')
    if movie.user != request.user:
        raise HttpResponseForbidden()
    # Rest of code omitted for brevity.


@login_required
def dashboard(request, template_name='movies/dashboard.html'):
    movies = Movie.objects.active().filter(
        user=request.user).order_by('-created_at')
    # Rest of code omitted for brevity.

私はRubyonRailsに強いバックグラウンドを持っており、コントローラーでbefore_filter:find_userを使用するだけなので、重複を回避できます。この種の重複を処理するためのDjangoの最良の方法は何ですか?

J

4

2 に答える 2

4

403ではなく404を表示しても問題がない場合は、次のように実行できます。

movie = get_object_or_404(Movie, slug=slug, user=request.user)
于 2012-11-24T23:06:03.810 に答える
2

同じコードをコピーする代わりに、それを実行する単純な関数を作成してみませんか?

def get_movie(slug, user):
    movie = get_object_or_404(Movie, slug=slug)
    if movie.user != user:
        raise Http403
    return movie
于 2012-11-24T23:15:56.430 に答える