Django基础教程(105)Django请求和响应之使用新组件编写视图:别再说Django视图老土了!新组件上手,代码写得飞起,老板直呼内行!

嘿,各位Django探险家们!今天咱们不聊那些老生常谈的MVT架构,也不掰扯复杂的模型关系。咱们就来唠点实在的——怎么把Django的视图写得既牛逼又潇洒

你是不是也经历过这样的场景:拿到一个需求,吭哧吭哧地在视图函数里用HttpResponse手动拼接一堆HTML字符串,感觉自己像个中世纪抄写员,写得头晕眼花,代码还又长又难维护?心里默默吐槽:“这都202X年了,写个Web应用咋还这么原始?”

兄弟,我懂你!今天,我就是来给你送“弹药”的。Django其实早就给我们准备了一整套现代化的“武器库”,只是很多教程没重点讲。掌握了它们,你的开发效率和对Django的理解,绝对能原地起飞!

第一章:重温“上古时代”——我们曾经是怎么写视图的?

为了感受新武器的香,咱得先回忆一下旧社会的苦。最基础的视图长这样:

from django.http import HttpResponse

def old_school_view(request):
    # 1. 手动检查请求方法(心累)
    if request.method != 'GET':
        return HttpResponse('Method Not Allowed', status=405)
    
    # 2. 手动获取查询参数(眼瞎)
    name = request.GET.get('name', '陌生人')
    
    # 3. 用字符串拼接HTML(手酸)
    html_content = f"""
    <!DOCTYPE html>
    <html>
    <head><title>老土页面</title></head>
    <body>
        <h1>你好啊,{name}!</h1>
        <p>这个页面也太复古了吧!</p>
    </body>
    </html>
    """
    # 4. 返回Response(终于完事了)
    return HttpResponse(html_content)

看到了吗?一堆if判断,繁琐的参数获取,还有那令人崩溃的字符串HTML。这代码,写起来容易出错,维护起来想打人。它就像是你家厨房里那把锈迹斑斑的菜刀,能用,但切个肉都能累出肱二头肌。

第二章:亮出你的“瑞士军刀”——Django的现代化响应组件

好了,吐槽完毕,现在请出我们的“神器天团”!

1. JsonResponse:API开发者的挚爱

现在谁还不写个前后端分离的项目?JsonResponse就是为你量身定做的。它自动将Python字典(或列表)转换成JSON,并设置正确的Content-Type头。

from django.http import JsonResponse

def api_view(request):
    data = {
        'status': 'success',
        'message': '你好,世界!',
        'user': {
            'id': 1,
            'name': '码农小A'
        }
    }
    # 一行代码,搞定所有!就是这么优雅!
    return JsonResponse(data)

访问这个视图,你会直接得到一个干净漂亮的JSON:{"status": "success", "message": "你好,世界!", "user": {"id": 1, "name": "码农小A"}}。再也不用手动json.dumps了,感动吗?

2. HttpResponseRedirect:网页导航的“任意门”

用户注册成功了要跳转到首页?文章发布完了要跳转到详情页?这时候就需要重定向。

from django.http import HttpResponseRedirect
from django.urls import reverse

def post_article_view(request):
    # ... 这里是处理文章提交的逻辑 ...
    # 假设文章保存成功,我们想跳转到文章列表页
    # 使用reverse通过URL的名字反向解析出实际路径,避免硬编码
    articles_url = reverse('article_list')
    return HttpResponseRedirect(articles_url)

    # 或者更简单,直接写已知的URL路径
    # return HttpResponseRedirect('/articles/')

它就像哆啦A梦的任意门,告诉浏览器:“别在这待着了,赶紧去那个门(URL)后面看看!”

3. get_object_or_404:优雅的“查无此人”处理

从数据库根据ID取对象,如果不存在怎么办?传统做法是try...except,啰嗦!

# 传统啰嗦写法
from django.http import Http404
def old_detail_view(request, pk):
    try:
        article = Article.objects.get(pk=pk)
    except Article.DoesNotExist:
        raise Http404("文章不存在哦!")
    # ... 后续处理 ...

# 新潮潇洒写法
from django.shortcuts import get_object_or_404

def cool_detail_view(request, pk):
    # 一句话搞定!有就返回对象,没有自动抛出404错误!
    article = get_object_or_404(Article, pk=pk)
    # ... 后续处理 ...

这个组件的好处是,它遵循了Web的约定:“没有找到资源,就返回404状态码”,既符合RESTful规范,又让代码简洁到没朋友。

4. render 短函数:模板渲染的“快捷键”

虽然它不算新,但和HttpResponse手动渲染模板相比,它依然是伟大的进步。

from django.shortcuts import render

def modern_template_view(request):
    context = {
        'title': '新时代的页面',
        'users': ['小明', '小红', '小刚']
    }
    # 指定模板文件,传入上下文数据,一键合成最终HTML!
    return render(request, 'my_app/modern_template.html', context)

它帮你完成了创建模板加载器、渲染模板、最终生成HttpResponse的全过程,是你告别字符串拼接的救星。

第三章:实战!用新组件打造一个“相亲角”应用

光说不练假把式。我们来用上面这些组件,快速构建一个迷你版的“相亲信息发布与浏览”应用。

1. 模型定义 (models.py)

from django.db import models

class Profile(models.Model):
    GENDER_CHOICES = (('M', '男'), ('F', '女'))
    name = models.CharField(max_length=100, verbose_name='昵称')
    age = models.IntegerField(verbose_name='年龄')
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES, verbose_name='性别')
    intro = models.TextField(verbose_name='自我介绍')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

2. 视图逻辑 (views.py) —— 核心舞台!

from django.shortcuts import render, get_object_or_404, redirect
from django.http import JsonResponse, HttpResponseRedirect
from django.urls import reverse
from .models import Profile

# 查看所有相亲资料的API接口(使用JsonResponse)
def profile_list_api(request):
    profiles = Profile.objects.all().values('id', 'name', 'age', 'gender') # 只取需要的字段
    profiles_list = list(profiles) # QuerySet需要转成List
    return JsonResponse({'data': profiles_list})

# 创建新资料的页面和逻辑(使用render和redirect)
def create_profile(request):
    if request.method == 'POST':
        # 实际项目中这里要用Django Forms或Serializer
        name = request.POST.get('name')
        age = request.POST.get('age')
        gender = request.POST.get('gender')
        intro = request.POST.get('intro')
        
        Profile.objects.create(
            name=name,
            age=age,
            gender=gender,
            intro=intro
        )
        # 创建成功后,重定向到资料列表页面
        return HttpResponseRedirect(reverse('profile_list_page'))
    
    # 如果是GET请求,就渲染一个表单页面
    return render(request, 'dating/create_profile.html')

# 查看某个资料的详情页(使用get_object_or_404和render)
def profile_detail(request, profile_id):
    # 优雅地获取对象,不存在则自动404
    profile = get_object_or_404(Profile, pk=profile_id)
    context = {'profile': profile}
    return render(request, 'dating/profile_detail.html', context)

# 一个同时支持HTML和JSON的“混合”视图
def flexible_profile_list(request):
    profiles = Profile.objects.all()
    
    # 如果客户端要求JSON(比如Ajax请求)
    if request.headers.get('Accept') == 'application/json':
        data = [{'name': p.name, 'age': p.age} for p in profiles]
        return JsonResponse(data, safe=False) # safe=False允许序列化列表
    
    # 默认返回HTML页面
    context = {'profiles': profiles}
    return render(request, 'dating/profile_list.html', context)

3. 模板示例 (templates/dating/profile_list.html)

<!DOCTYPE html>
<html>
<head>
    <title>非诚勿扰 - 资料库</title>
</head>
<body>
    <h1>优质嘉宾列表</h1>
    <a href="{% url 'create_profile' %}">我也要发布资料</a>
    <ul>
        {% for profile in profiles %}
        <li>
            <a href="{% url 'profile_detail' profile.id %}">
                {{ profile.name }} ({{ profile.get_gender_display }}, {{ profile.age }}岁)
            </a>
        </li>
        {% empty %}
        <li>暂无资料,快来成为第一个吧!</li>
        {% endfor %}
    </ul>
    <button onclick="loadApi()">偷偷看一眼JSON数据</button>
    <script>
        function loadApi() {
            fetch('/api/profiles/') // 调用我们写的API接口
                .then(response => response.json())
                .then(data => console.log('API返回的数据:', data));
        }
    </script>
</body>
</html>

4. URL配置 (urls.py)

from django.urls import path
from . import views

urlpatterns = [
    path('api/profiles/', views.profile_list_api, name='profile_list_api'),
    path('profiles/', views.flexible_profile_list, name='profile_list_page'),
    path('profile/create/', views.create_profile, name='create_profile'),
    path('profile/<int:profile_id>/', views.profile_detail, name='profile_detail'),
]
第四章:总结与升华

怎么样?通过这个有点“无厘头”但功能完整的“相亲角”应用,你是不是已经感受到了新组件的强大威力?

  • JsonResponse 让你轻松构建API,拥抱前端框架。
  • HttpResponseRedirectreverse 让你的页面流转清晰可控,告别URL硬编码。
  • get_object_or_404 让你的代码更健壮、更符合Web规范,处理异常情况优雅从容。
  • render 让你彻底摆脱手动拼接HTML的苦海,专注于业务逻辑和模板设计。

把它们组合起来使用,你的Django视图代码将发生质变:更短、更易读、更专业、更易于维护

所以,别再守着那古老的HttpResponse不放了。勇敢地拿起这些现代武器,让你的Django开发之旅,从此变得高效而愉悦!你的代码会感谢你,你的同事会崇拜你,你的老板也会对你刮目相看!

快去你的项目中试试吧!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值