6

私は自分自身を開発しましたが、他の誰かがおそらく最初にそれを考えて、より良い仕事をしたのは十分に素晴らしいことのようです ;)

目標は、myapp/views.py に書き込めるようにすることです。

router = Router(prefix=r'^myapp/')

@router.route(url=r'my/url/here', name="my-great-view")
def myview(request):
    return render_to_response("mytemplate.html", {})

そしてurls.pyで

urlpatterns += myapp.views.router.get_patterns()

そして、私が組み込んだ他のいくつかのクールなデコレータがあります(返された辞書を取得してjson応答を作成するための@jsonview、返された辞書を取得して定義されたテンプレートにコンテキストとして渡すための@use_template...)

このようにして、すべてがよりローカライズされ、読みやすくなるようです。ビュー関数を見るとき、それが属する URL や「名前」を見つけるためにあちこち検索する必要はありません。

このdjangosnippetを見ましたが、それは私が望むよりもはるかに魔法であり、一般的に採用されているようには見えません。

誰も標準的な解決策をまとめていない場合、解決策を片付けて、contrib にプル リクエストを送信する必要がありますか?

  • これが私が現在実装しているものです:magic.py

編集: 同じビューに複数の URL が必要な場合:

@router.route(url="my-first-url", kwargs={'foo':'bar'})
@router.route(url="my-second=url", kwargs={'foo':'baz'})
def my_view(...): ...

もちろん、これが唯一の方法である必要はありません通常の urlpatterns の方法には 2 つの優れた点がありますが、これら 2 つの方法は相互に排他的ではありません。

4

2 に答える 2

2

通常の構成には、メインのウェブサイトがありurls.pyます。そして、urls.pyという名前の変数が含まれていますurlpatterns

そのため、いくつかの url_pattern をそれにプッシュできます。

app/views.py

from django.urls import path as djpath

URLS = []
URLS_d = {}


def route(path=''):
    def wrapper(func):
        path_name = path or func.__name__
        URLS.append(
            djpath(path_name, func)
        )

        ### below is not important ####
        path_func = URLS_d.get(path_name, None)
        if path_func:
            print(path_func, '<>', func)
            raise Exception('THE same path')
        URLS_d[path_name] = func
        ### above is not important ####

    return wrapper

@route()
def index(req):
    return HttpResponse('hello')

ウェブサイト/urls.py

from app.views import URLS

urlpatterns.extend(URLS)
于 2019-10-08T08:54:35.853 に答える