Django視圖詳解

前言

歡迎來到我的博客

個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客


一、Django視圖是什么?

視圖(View) 是Django處理HTTP請求的核心組件。它接收一個HttpRequest對象,處理業務邏輯,并返回一個HttpResponse對象(如網頁、JSON數據、重定向等)。

1. 視圖的兩種寫法
  • 函數視圖(FBV,Function-Based Views) :用Python函數實現。

    from django.http import HttpResponsedef hello(request):return HttpResponse("Hello World!")
    
  • 類視圖(CBV,Class-Based Views) :用類的方法處理請求(更結構化,適合復用)。

    from django.views import View
    from django.http import HttpResponseclass HelloView(View):def get(self, request):return HttpResponse("GET請求示例")def post(self, request):return HttpResponse("POST請求示例")
    

二、編寫第一個視圖:詳細步驟

1. 創建視圖函數

views.py中定義一個處理請求的函數:

# myapp/views.py
from django.http import HttpResponsedef home_page(request):return HttpResponse("<h1>歡迎來到我的網站!</h1>")
2. 配置URL路由

urls.py中將URL路徑映射到視圖:

# myproject/urls.py
from django.urls import path
from myapp import viewsurlpatterns = [path('', views.home_page, name='home'),  # 根路徑指向home_page視圖
]
3. 運行開發服務器
python manage.py runserver

訪問 [http://127.0.0.1:8000](http://127.0.0.1:8000) 即可看到頁面。


三、深入理解請求(HttpRequest)和響應(HttpResponse)

1. HttpRequest對象:包含請求的所有信息
  • 常用屬性

    • request.method:請求方法(GET、POST等)
    • request.GET:GET請求的參數(字典形式)
    • request.POST:POST請求的表單數據
    • request.FILES:上傳的文件
    • request.user:當前登錄用戶(需啟用認證中間件)
  • 示例:處理GET請求參數

    def greet(request):name = request.GET.get('name', '游客')  # 獲取name參數,默認值'游客'return HttpResponse(f"你好,{name}!")
    

?

2. HttpResponse對象:返回內容給瀏覽器
  • 常見用法

    • 返回文本:HttpResponse("文本內容")
    • 返回HTML:HttpResponse("<h1>標題</h1>")
    • 返回JSON:JsonResponse({'data': 'xxx'})
    • 重定向:HttpResponseRedirect('/new-url/')
  • 示例:返回JSON數據

    from django.http import JsonResponsedef json_example(request):data = {'status': 'success', 'message': '請求成功'}return JsonResponse(data)
    


    四、函數視圖(FBV)的完整流程

    1. 處理GET和POST請求
    def contact(request):if request.method == 'POST':# 處理表單提交name = request.POST.get('name')email = request.POST.get('email')print(f"收到來自{name} ({email}) 的消息")return HttpResponseRedirect('/thanks/')  # 重定向到感謝頁面else:# 顯示空表單return render(request, 'contact.html')
    
    2. 渲染模板(Template)

    使用render()函數將數據傳遞到HTML模板:

    from django.shortcuts import renderdef article_list(request):articles = Article.objects.all()  # 假設Article是模型return render(request, 'articles/list.html', {'articles': articles})
    

    模板文件 articles/list.html

    {% for article in articles %}<h2>{{ article.title }}</h2><p>{{ article.content }}</p>
    {% endfor %}
    

    五、類視圖(CBV)的用法詳解

    1. 基本結構
    from django.views import View
    from django.http import HttpResponseclass MyView(View):def get(self, request):# 處理GET請求return HttpResponse("GET請求")def post(self, request):# 處理POST請求return HttpResponse("POST請求")
    
    2. 在URL中使用類視圖
    # urls.py
    urlpatterns = [path('myview/', MyView.as_view(), name='my-view'),
    ]
    
    3. 類視圖的優勢:復用與擴展
    • 繼承內置通用視圖(如ListView, DetailView
    • 重寫方法自定義行為:
      class ArticleListView(ListView):model = Article  # 關聯模型template_name = 'articles/list.html'  # 指定模板context_object_name = 'article_list'  # 模板中使用的變量名def get_queryset(self):# 過濾已發布的文章return Article.objects.filter(status='published')
      

    六、通用視圖(Generic Views)快速入門

    Django內置了處理常見場景的類視圖,極大簡化代碼。

    概念:

    通用視圖(Generic Views)是Django為解決Web開發中重復模式設計的"快捷工具包",它能讓你用極簡代碼實現以下常見功能:

    • 顯示對象列表(如商品列表、文章列表)
    • 展示單個對象詳情(如用戶詳情頁)
    • 處理表單創建/修改對象(如新建訂單)
    • 日期歸檔頁面(如按月份展示文章)
    • 刪除對象前的確認操作

    傳統函數視圖需要手動處理數據庫查詢、模板渲染等細節,而通用視圖通過"約定優于配置"原則自動完成這些基礎工作

    1. ListView:顯示對象列表
    from django.views.generic import ListViewclass BookListView(ListView):model = Book  # 自動獲取所有Book對象template_name = 'books/book_list.html'  # 默認模板:books/book_list.htmlcontext_object_name = 'books'  # 模板中變量名(默認object_list)
    
    2. DetailView:顯示單個對象詳情
    from django.views.generic import DetailViewclass BookDetailView(DetailView):model = Book# 默認模板:books/book_detail.html# 通過URL中的pk或slug獲取對象(如 /books/1/)
    
    3. 表單處理:CreateView/UpdateView
    from django.views.generic.edit import CreateView
    from django.urls import reverse_lazyclass BookCreateView(CreateView):model = Bookfields = ['title', 'author', 'price']  # 表單字段template_name = 'books/book_form.html'success_url = reverse_lazy('book-list')  # 提交成功后跳轉的URL
    

    七、實際場景案例

    1. 用戶登錄視圖
    from django.contrib.auth import authenticate, login
    from django.shortcuts import render, redirectdef login_view(request):if request.method == 'POST':username = request.POST['username']password = request.POST['password']user = authenticate(request, username=username, password=password)if user is not None:login(request, user)return redirect('home')else:return render(request, 'login.html', {'error': '用戶名或密碼錯誤'})return render(request, 'login.html')
    
    2. 文件上傳
    def upload_file(request):if request.method == 'POST' and request.FILES['file']:uploaded_file = request.FILES['file']# 保存文件到服務器with open(f'uploads/{uploaded_file.name}', 'wb+') as destination:for chunk in uploaded_file.chunks():destination.write(chunk)return HttpResponse("文件上傳成功!")return render(request, 'upload.html')
    

    八、常見問題與調試技巧

    1. 404錯誤處理
    • 使用get_object_or_404替代get
      from django.shortcuts import get_object_or_404def book_detail(request, pk):book = get_object_or_404(Book, pk=pk)return render(request, 'books/detail.html', {'book': book})
      
    2. 調試視圖
    • 打印請求信息
      def debug_view(request):print("請求方法:", request.method)print("GET參數:", request.GET)print("用戶:", request.user)return HttpResponse("查看控制臺輸出")
      
    3. 單元測試
    from django.test import TestCase, Clientclass ViewTests(TestCase):def test_home_page(self):client = Client()response = client.get('/')self.assertEqual(response.status_code, 200)self.assertContains(response, "歡迎")
    

    九、最佳實踐總結

    1. 選擇合適的視圖類型

      • 簡單邏輯用函數視圖(FBV)
      • 復雜或重復邏輯用類視圖(CBV)
    2. 保持視圖簡潔

      • 業務邏輯抽離到單獨模塊(如utils.py
      • 使用通用視圖減少重復代碼
    3. 安全注意事項

      • 始終驗證用戶輸入
      • 使用@login_required限制敏感操作
      • 啟用CSRF保護(表單中加{% csrf_token %}
    4. 性能優化

      • 使用select_relatedprefetch_related優化數據庫查詢
      • 緩存頻繁訪問的視圖(如使用@cache_page裝飾器)

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/76089.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76089.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/76089.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    【工具變量】上市公安企業社會信任數據集(2004-2023年)

    企業社會信任是衡量企業與社會之間信任度的重要指標&#xff0c;反映了企業在公眾眼中的信譽和可靠性。社會信任對企業的持續發展和品牌形象有著至關重要的影響。本分享數據參考張維迎&#xff08;2002年&#xff09;的做法&#xff0c;采用中國企業家調查系統的地區信任調查數…

    Python爬取數據(二)

    一.example2包下的 1.re模塊的compile函數使用 import repatternre.compile(r\d) print(pattern) 2.match的方法使用 import re patternre.compile(r\d) # m1pattern.match(one123twothree345four) #參數2&#xff1a;指定起始位置(包含),參數3&#xff1a;終止位置(包含),…

    spring之Bean的循環依賴問題、反射機制手寫Spring框架、Spring IoC注解式開發

    一、Bean的循環依賴問題 1.什么是Bean的循環依賴 A對象中有B屬性。B對象中有A屬性。這就是循環依賴。我依賴你&#xff0c;你也依賴我。 比如&#xff1a;丈夫類Husband&#xff0c;妻子類Wife。Husband中有Wife的引用。Wife中有Husband的引用。 public class Husband {priv…

    狀態機的基本使用

    狀態機 1. 什么是狀態機 1.1 場景 在業務代碼中對一些業務狀態進行硬編碼&#xff0c;如果有一天更改了業務邏輯就需要更改代碼&#xff0c;不方便進行系統擴展和維護。 if (status 狀態1) {// TODO } else if(status 狀態2) {// TODO } ...另外對訂單狀態的管理是散落在…

    22 | 如何繼續提升 Go 開發技術?

    提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰營 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;。 「Go 項目開發極速…

    LLM Agents項目推薦:MetaGPT、AutoGen、AgentVerse詳解

    這一部分我們將深入介紹三大備受關注的LLM Agents項目&#xff1a;MetaGPT、AutoGen和AgentVerse&#xff0c;包括它們的背景、設計思路、主要功能、技術亮點以及典型應用場景。 1. MetaGPT&#xff1a;讓AI像軟件工程團隊一樣協作 項目背景 MetaGPT由Huang et al.于2023年提…

    好數(藍橋杯2024省賽B組)

    題目描述 一個整數如果按從低位到高位的順序&#xff0c;奇數位&#xff08;個位、百位、萬位……&#xff09;上的數字是奇數&#xff0c;偶數位&#xff08;十位、千位、十萬位……&#xff09;上的數字是偶數&#xff0c;我們就稱之為“好數”。 給定一個正整數 N&#xf…

    STM32單片機入門學習——第26節: [9-2] USART串口外設

    寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.04.08 STM32開發板學習——第26節: [9-2] USART串口外設 前言開發板說明引用解答和科普…

    【學Rust寫CAD】31 muldiv255函數(muldiv255.rs,已經取消)

    源碼 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

    LLM+js實現大模型對話

    代碼運行效果圖&#xff1a;前提是你有一個可用的openai服務&#xff0c;然后用下面一個html頁即可啟動 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…

    用claude3.7,不到1天寫了一個工具小程序(11個工具6個游戲)

    一、功能概覽和本文核心 本次開發&#xff0c;不是1天干擼&#xff0c;而是在下班后或早起搞的&#xff0c;總體加和計算了一下&#xff0c;大概1天的時間&#xff08;12個小時&#xff09;&#xff0c;平常下班都是9點的衰仔&#xff0c;好在還有雙休&#xff0c;謝天謝地。 …

    C++實現文件斷點續傳:原理剖析與實戰指南

    文件傳輸示意圖 一、斷點續傳的核心價值 1.1 大文件傳輸的痛點分析 網絡閃斷導致重復傳輸&#xff1a;平均重試3-5次。 傳輸進度不可回溯&#xff1a;用戶無法查看歷史進度。 帶寬利用率低下&#xff1a;每次中斷需從頭開始。 1.2 斷點續傳技術優勢 指標傳統傳輸斷點續傳…

    升級 SAP S/4 HANA 之 EWM 攻略

    目錄 簡介 知識點 數據遷移 簡介 倉庫管理&#xff0c;SAP 升級不管是否啟動 EWM 功能&#xff0c;評估 EWM 是必經之路&#xff0c;不僅是因為 EWM 是 SAP 主推的倉庫解決方案&#xff0c;更是其功能強大而便捷&#xff0c;不管是簡易倉庫、復雜倉庫、立體倉庫、高架倉庫、…

    知識表示方法之六:過程表示法(Procedural Representation)

    在人工智能的發展史中&#xff0c;關于知識的表示方法曾存在兩種不同的觀點。一種觀點認為知識主要是陳述性的&#xff0c;其表示方法應著重將其靜態特性&#xff0c;即事物的屬性以及事物間的關系表示出來&#xff0c;稱以這種觀點表示知識的方法為陳述式或說明式表示法&#…

    綠色供應鏈管理體系認證:開啟企業可持續發展的綠色新篇章

    在全球“雙碳”目標驅動下&#xff0c;綠色供應鏈管理已成為企業高質量發展的核心議題。據國際權威機構預測&#xff0c;到2030年&#xff0c;綠色供應鏈相關市場規模將突破萬億美元。在此背景下&#xff0c;綠色供應鏈管理體系認證不僅是企業合規的“通行證”&#xff0c;更是…

    MATLAB如何打印一個桃心形狀

    在MATLAB中打印一個桃心形狀&#xff0c;您可以使用繪圖函數來創建一個心形圖案。以下是一個簡單的例子&#xff0c;展示了如何使用MATLAB繪制一個心形&#xff1a; 定義心形的參數方程&#xff1a;心形可以通過一組參數方程來描述。 使用MATLAB的繪圖函數&#xff1a;plot函…

    前端知識(vue3)

    1.Vue3 1.1 介紹 Vue&#xff08;讀音 /vju?/, 類似于 view&#xff09;是一款用于構建用戶界面的漸進式的JavaScript框架 官網&#xff1a;https://cn.vuejs.org 1.2 常見指令 指令&#xff1a;指的是HTML 標簽上帶有 v- 前綴的特殊屬性&#xff0c;不同指令具有不同含義…

    狀態機思想編程

    1. LED流水燈的FPGA代碼 一個使用狀態機思想來實現LED流水燈的FPGA代碼 這個例子采用VHDL編寫 VHDL代碼示例&#xff1a; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;entity led_flowing isPort ( clk …

    網絡安全小知識課堂(五)

    病毒與蠕蟲&#xff1a;你的電腦為何會 “生病” 和 “傳染”&#xff1f; 引言 你是否見過這樣的場景&#xff1a;電腦突然彈窗廣告暴增&#xff0c;文件莫名消失&#xff0c;甚至整個公司網絡集體癱瘓&#xff1f;這些癥狀背后&#xff0c;可能是 ** 病毒&#xff08;Virus…

    RVOS-1.環境搭建與系統引導

    0.環境搭建 riscv-operating-system-mooc: 開放課程《循序漸進&#xff0c;學習開發一個 RISC-V 上的操作系統》配套教材代碼倉庫。 mirror to https://github.com/plctlab/riscv-operating-system-mooc 在 Ubuntu 20.04 以上環境下我們可以直接使用官方提供的 GNU工具鏈和 QEM…