views.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path("admin/", admin.site.urls),
    path('test/', include(('test2.urls', 'test2'),namespace='test2')),
]
from django.contrib import admin
from django.urls importるー path
from . import views

urlpatterns = [
    path('test_page',views.TestView.as_view(), name = 'test_view'),
]
from django.shortcuts import render
from django.views.generic import View
from django.http import JsonResponse

class TestView(View):
    def get(self, request):
        return render(request, 'test.html')

    def post(self, request):
        return JsonResponse({'test': 'test_value'})
views.pyでは、フロントエンドに返す値の整形を行います。
上の例では、settings.pyのTEMPLATESの'DIRS'が[os.path.join(BASE_DIR, 'templates')]となっていれば、
ルート/test/test_pageにアクセス時にtemplatesフォルダのtest.htmlがブラウザに表示されるようになっています。

view.pyで作成するクラスはViewを継承させてください(ListViewなどを継承させても間接的に継承される)

urls.pyでルーティングされ、対象のクラスに処理が来ると、HTTPリクエストメソッド(getやpostなど)によって使用されるメソッドが切り替えられます。
getはデータをもらうだけの通常のアクセス
postはテンプレート側からもデータを渡す必要があるとき
putはデータベースなどのデータの更新時
deleteはデータベースなどのデータ削除時
に使用されるHTTPリクエストメソッドで、継承しているViewクラスにはget、post、put、deleteメソッドが用意されており、対象のメソッドをオーバーライド(クラス内で新たに定義して上書き)することで使用されます。
またそれらの第1引数はself(自クラスのこと)、第2引数はrequest(テンプレート側から渡されるデータ)としてください。

通常アクセス時にはgetメソッドが使用されます。
return render(request, 'フロントエンドに返すテンプレート', フロントエンドに返したい変数などがあれば辞書型で)

とすることでブラウザには返されたHTMLファイルが表示されます。
render()の第3引数の辞書型はフロントエンドでキーを変数名として、値を使用することができます。
フロントエンドに変数を返す必要がないときはrender()の第3引数は未記入で問題ありません。
通常の画面表示のみの時はgetメソッドを記入するだけで問題ありません。

Ajaxなどで、テンプレート側からpostメソッドでデータを受け取ったときはpostメソッドが使用されます。
JsonResponse({フロントエンドに返すデータを辞書型で記入})

と記入することで非同期通信を行うことができます。

postメソッドなどで画面を遷移させたいときは
return redirect(移動したいページのurls.pyのname)

の形式で記入することで遷移させることができます。