django创建app、在视图函数及url中使用参数、url命名、通过redirect实现网页路径跳转...

本文详细介绍了在Django项目中如何创建和管理多个App,包括视图函数的定义、URL配置及命名规范,以及如何通过URL反转实现网页跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

app用来实现一个独立的功能,视图一般都写在app的view.py中,并且视图的第一个参数永远是request,视图的返回值必须是HttpResponseBase对象或子类的对象。

 

创建一个app:first_project

进入项目所在文件夹,python manage.py startapp appname 

views.py视图函数如下

from django.http import HttpResponse
# Create your views here.
def book(request):
    return HttpResponse('Home page of book')
def book_detail(request,book_catagory,book_id): #这两个参数的名字要与url.py中的参数名称一致
    text='The book is in %s catagory,and it's id is %s'%(book_catagory,book_id)
    return HttpResponse(text)
def book_author(request):
    author_name=request.GET.get('name')#通过request.GET.get获取输入的参数
    text = 'The author of the book is %s'%author_name
    return HttpResponse(text)

 

对应项目的url.py如下

from django.http import HttpResponse
from book import views  #需要引入book项目的视图

def index(request):
    return HttpResponse('首页')

urlpatterns = [
    path('', index),    #定义输入参数为空的返回情况
    path('admin/', admin.site.urls),
    path('book/',views.book),
    path('book_detail/<book_catagory>/<book_id>',views.book_detail),#尖括号表示可以在浏览器中传入的参数,注意此处的参数名称要与视图函数定义的参数名称一致
    path('book_author/',views.book_author)
]

以上,如果调用book_detail,可在浏览器中输入http://127.0.0.1:8000/book_detail/health/3

以上,如果调用author,可以再浏览器中输入http://127.0.0.1:8000/book_author?name=libai

 

创建多个app:url_name_demo

先创建一个项目:django-admin startproject url_name_demo

再在这个项目下创建两个app:

cd url_name_Demo

python manage.py startapp front

python manage.py startapp cms

然后手动在front和cms的app里分别创建urls.py文件

front和cms的views.py文件分别如下

#front
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('Home page of front')

def login(request):
    return HttpResponse('Login of front')


#cms
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse('Home page of cms')

def login(request):
    return HttpResponse('Login of cms')

 

front和cms的urls.py文件分别如下

#front
from django.urls import path
from . import views
urlpatterns=[
    path('',views.index),
    path('login/',views.login)
]

#cms
from django.urls import path
from . import views
urlpatterns=[
    path('',views.index),
    path('login/',views.login)
]

 

整个项目的urls.py文件如下

from django.contrib import admin
from django.urls import path,include  #还需导入include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('front.urls')),  #通过include将app的url与app的视图关联起来
    path('cms',include('cms.urls'))
]

 

运行整个项目:

在浏览器输入http://127.0.0.1:8000/,显示Home page of front

在浏览器输入http://127.0.0.1:8000/login,显示Login of front

在浏览器输入http://127.0.0.1:8000/cms,显示Home page of cms

在浏览器输入http://127.0.0.1:8000/cms/login,显示Login of cms

 

 

 

网页跳转:

模块导入:from django.shortcuts import redirect

实现跳转:return redirect('/login') 参数为指定要跳转的功能网页,/login会重新从urls文件的路径中去进行匹配。

通过redirect('/login')实现网页跳转,通过render(request,'*.html')也可以实现同样效果,但是两者有实质性的区别。通过redict实现跳转,会根据redict指定的路径重新去urls文件进行路径匹配并执行相应的函数再返回网页,在浏览器中看到的也是一个新的url地址,而直接通过render进行跳转,只是将指定网页渲染出来,浏览器看到的url地址并不会发生改变。 

 

 

url取名:

上述例子中的所有url的名称一旦改变,其他所有需要跳转到该url的引用都需要修改,为避免出现这个问题,可以给url取一个名字,后续通过反转这个url这个名字去找到对应的url

from django.shortcuts import redirect,reverse

路径写法:path('login/',views.login,name='login')

实现跳转:return redirect(reverse('login')) 

即后续login/的url不论如何改变,改变成logging/、signin或者其他,都可以通过reverse('login')找到对应的url

 

由于多个app可能存在相同的url,为了避免在反转时对url产生混淆,可以在每个app的urls.py文件中通过app_name指定应用命名空间即可,后续在反转时同时指定命名空间和url

例如front app的urls.py文件中指定app_name='front'

路径写法:path('login/',views.login,name='login')

实现跳转:return redirect(reverse(front:'login')) 

 

转载于:https://www.cnblogs.com/Forever77/p/10121687.html

<think>好的,我现在需要帮助用户解决在Django项目实现点击登录按钮后跳转到另一页面的问题。首先,我得回顾一下Django的基本结构和流程,确保自己理解正确。 用户的问题是关于登录跳转的,所以可能需要涉及到视图函数URL配置、模板中的表单设置,以及可能的认证机制。根据提供的引用内容,特别是引用[1]、[3]、[4]和[5],我需要整合这些信息来构建一个完整的解决方案。 首先,用户点击登录按钮通常会触发一个表单提交,这个表单的action应该指向处理登录的URL。然后,对应的视图函数需要处理POST请求,验证用户凭证,成功后使用redirect函数跳转到目标页面。引用[1]提到使用重定向函数,而引用[3]中的例子展示了redirect使用方法,这很关键。 接下来是URL配置。根据引用[2]和引用[4],URL路径需要正确映射到视图函数。比如,处理登录的路径应该指向处理登录逻辑的视图,而登录成功后的跳转页面也需要相应的URL视图。同时,引用[4]提到参数传递的方式,但在这里可能不需要,除非跳转需要参数视图函数部分,根据引用[3]和引用[5],视图需要处理GET和POST请求。在POST请求中,使用request.POST获取表单数据,验证用户信息,如用户名和密码。验证成功后,使用redirect跳转。如果失败,可能需要返回错误信息。这里需要注意Django的认证系统,是否使用内置的authenticate和login方法,或者用户自己实现验证逻辑。 模板方面,登录页面需要一个表单,method设置为post,action指向登录处理URL。表单中的字段名需要与视图函数中获取的参数名一致,比如username和password。同时,要添加CSRF令牌,否则Django会拒绝POST请求。 此外,需要考虑URL命名和反向解析,这样在redirect时可以使用URL的名称而不是硬编码的路径,提高可维护性。引用[3]中的例子用了'app2_userinfo'这样的名称,说明应该使用Django的reverse函数redirect的快捷方式。 可能还需要处理登录状态,比如使用Django的session或认证系统。引用[5]提到QueryDict对象,但在处理登录时,可能需要从request.POST中获取用户名和密码,然后验证。如果使用Django内置的认证系统,可以调用authenticate和login函数,这会自动处理session。 现在,整合这些步骤: 1. 创建登录表单的模板,包含username和password的输入字段,form的action指向登录处理URL,method为post,并添加{% csrf_token %}。 2. 配置URL,将登录页面的URL映射到显示登录表单的视图函数处理GET请求),同时将处理表单提交的URL映射到处理登录逻辑的视图函数处理POST请求)。 3. 编写视图函数处理GET请求时返回登录页面,处理POST请求时验证用户信息,成功则redirect到目标页面,失败则返回错误信息。 4. 在登录成功的跳转页面配置对应的URL视图,可能是一个简单的TemplateView。 可能的错误点包括忘记CSRF令牌导致403错误,URL配置错误导致404,或者视图函数中没有正确处理POST请求。需要确保所有步骤正确衔接,并测试每个部分是否正常工作。 另外,是否需要使用Django内置的LoginView?如果用户希望使用自定义视图,可能需要自己编写逻辑,否则可以利用Django的认证视图简化流程。但根据用户提供的引用,他们可能希望手动实现,所以需要手动处理认证和跳转。 总结步骤应该是:模板表单→URL配置→视图函数处理登录→重定向。每个部分需要参考提供的引用内容,确保符合Django的最佳实践。</think>在Django实现登录跳转功能需要配置视图函数URL路由和模板,具体步骤如下: --- ### 一、创建登录表单模板(HTML) ```html <!-- templates/login.html --> <form method="post" action="{% url 'login_submit' %}"> {% csrf_token %} <input type="text" name="username" placeholder="用户名"> <input type="password" name="password" placeholder="密码"> <button type="submit">登录</button> </form> ``` *关键点:* - `action`指向处理登录的URL名称`login_submit`[^2] - 必须添加`{% csrf_token %}`防止跨站请求伪造[^5] --- ### 二、配置URL路由(urls.py) ```python # 项目urls.py from django.urls import path from . import views urlpatterns = [ path('login/', views.login_page, name='login_page'), # 登录页面 path('do_login/', views.login_submit, name='login_submit'), # 处理登录 path('dashboard/', views.dashboard, name='dashboard') # 跳转目标页 ] ``` *说明:* - `login_page`用于显示表单(GET请求) - `login_submit`处理提交数据(POST请求)[^2] --- ### 三、编写视图函数views.py) ```python from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login def login_page(request): return render(request, 'login.html') def login_submit(request): if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user = authenticate(request, username=username, password=password) if user is not None: login(request, user) # Django内置登录状态保持 return redirect('dashboard') # 跳转到仪表盘[^3] else: return render(request, 'login.html', {'error': '用户名或密码错误'}) return redirect('login_page') def dashboard(request): return render(request, 'dashboard.html') ``` *核心逻辑:* 1. 通过`request.POST.get()`获取表单数据[^4] 2. 使用`authenticate()`验证用户凭证 3. 登录成功调用`redirect('目标URL名称')`实现跳转[^1] --- ### 四、进阶配置建议 1. **使用Django内置LoginView**(简化流程): ```python from django.contrib.auth.views import LoginView class CustomLoginView(LoginView): template_name = 'login.html' redirect_authenticated_user = True # 已登录用户自动跳转 ``` *URL配置:* ```python path('login/', CustomLoginView.as_view(), name='login') ``` 2. **安全增强**: ```python # settings.py LOGIN_REDIRECT_URL = '/dashboard/' # 全局设置登录成功跳转地址 LOGOUT_REDIRECT_URL = '/login/' ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值