Django编程练习——10道

一、如何查看Django版本

命令行cmd -> python

1.>>>import django
     print(django.VERSION)
  (4, 0, 0, 'final', 0)
2.>>> django.get_version()
  4.0'

二、概述{% csrf_token %}的作用

**原因是django为了用户提交表单时防止跨站攻击所做的保护,只需在HTML文件的表单中添加{% csrf_token %}便可以解决问题。
django为用户实现防止跨站请求伪造的功能,通过中间件django.middleware.csrf.CsrfViewMiddleware来完成。
当用post提交数据的时候,django会去检查是否有一个csrf的随机字符串,如果没有就会报错,这也是之前我们一直将其注释的原因。**

全局:django.middleware.csrf.CsrfViewMiddleware
	
局部: @csrf_protect,为当前函数强制设置防跨站请求伪造功能,即便settings中没有设置全局中间件
       @csrf_exempt,取消当前函数防跨站请求伪造功能,即便settings中设置了全局中间件

三、 Hello World 是所有项目入门时都要完成的一个小功能。现在需要你使用 Django 来开发一个网站的首页,这个首页只需要显示 Hello, world! 的字样即可。使用浏览器访问 http://localhost:8000/ 时,返回给浏览器的内容中需要包含 Hello, world! 这个字符串,且 response 的 status code 是 200。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def index(requset):
     response = HttpResponse('Hello, world!', status = 200)
     return response

四、 实现一个功能,能够统计当前系统中已注册的用户数量,要求返回一个用户数量的数字。

from django.contrib.auth.models import User
from django.http.response import HttpResponse

def index(request):
    # write your code here
    count = User.objects.count()
    return HttpResponse(count)

五、 请完善在 users/services.py 中的方法UserService.get_or_create_user_by_username, 对于一个规定的 username, 如果已经存在一个用户使用了这个 username, 则返回这个用户的 User Object。如果不存在,则使用这个 username 创建一个新的用户,并且返回这个用户的 User Object。

解法一
from django.contrib.auth.models import User
class UserService(object):

    @classmethod
    def get_or_create_user_by_username(cls, username):
        # -- write your code here --
        user, isCreated = User.objects.get_or_create(username = username)
        return user
解法二
from django.contrib.auth.models import User
class UserService(object):

    @classmethod
    def get_or_create_user_by_username(cls, username):
        # -- write your code here --
        try:
            user = User.objects.get(username = username)
        except:
            user = User(username = username)
            user.save()
        return user

六、 这个题是一个 Bug Fix 的训练。我们按照教程 Django Rest Framework Install Tutorial 中的指引来安装 django 和 django-rest-framework 的环境,但是在访问主页http://localhost/ 的django.template.exceptions.的时候,代码抛出这样一个异常
TemplateDoesNotExist: rest_framework/api.html
你能来帮忙 debug 一下修复这个 bug 么?

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework'   # 这行是需要添加的代码
]

七、 这道题是一个 Bug Fix 训练,代码里提供了一个 API 用于帮助用户注册账号,但是里面有一些 bug。当我们调用 Signup 的 API 的时候,抛出了如下异常信息
AssertionError: The field 'emial' was declared on serializer SignupSerializer, but has not been included in the 'fields' option.
请你过一下代码并修复所有bugs。

解决该问题主要是查找报错中的‘emial’在我们代码的什么地方,快捷键ctrl+F查找每个代码页,发现该单词在serializers.py中出现

serializers.py

class SignupSerializer(serializers.ModelSerializer):
    username = serializers.CharField(max_length=20, min_length=6)
    password = serializers.CharField(max_length=20, min_length=6)
    email = serializers.EmailField()   # 题目本来的代码为emial

八、 请写一个 Django queryset 用来查询所有教师的信息并按照年龄升序排序。teachers.models.Teacher 作为存储教师信息的 Model。

from teachers.models import Teacher
class TeacherService(object):

    @classmethod
    def get_teachers_order_by_age(cls):
        # -- write your code here --
        return Teacher.objects.all().order_by('age')

order_by(*fields)
默认情况下,QuerySet 返回的结果是按照模型 Meta 中的 ordering 选项给出的排序元组排序的。可以通过使用 order_by 方法在每个 QuerySet 的基础上覆盖这一点。
举例:
Entry.objects.filter(pub_date_year=2005).order_by(‘-pub_date’, ‘headline’)
上述结果将按 pub_date 降序排列,然后按 headline 升序排列。“-pub_date” 前面的负号表示 降序。升序是隐含的。

九、 请写一个 Django queryset 用来查询所有年龄超过n 岁教师的信息。

from django.db.models import QuerySet
from teachers.models import Teacher

class TeacherService(object):

    @classmethod
    def filter_teachers_by_age(cls, age: int) -> QuerySet:
        # -- write your code here --
        # 方法一
   		return Teacher.objects.filter(age__gt = age)

		# 方法二
		qs = Teacher.objects.all()
		return qs.filter(age__gt = age)
Django查找
__gt大于
__gte大于等于
__lt小于
__lte小于等于
__contains模糊查找

十、 请写一个 Django queryset 查询所有邮箱为某个domain邮箱的教师信息。domain取值可以为 qq.com 或者 163.com 等。

from django.db.models import QuerySet
from teachers.models import Teacher

class TeacherService(object):

    @classmethod
    def filter_teachers_by_domain(cls, domain: str) -> QuerySet:  
        # -- write your code here --
    	# 方法一
    	return Teacher.objects.filter(email__endswith='@{}'.format(domain))
        
        # 方法二
        return Teacher.objects.filter(email__endswith=(‘@’+domain))

endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。

Django判断
+__isnull判断此字段为空
+__startswith判断属性由某字符串开始的行
+__endswith判断属性由某字符串结束的行
+__contains判断属性包含某字符串的行
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值