Django(7)-项目实战-发布会签到管理系统

本文使用django实现一个简单的发布会签到管理系统 

登录功能

模板页面

sign/templates/index.html

<!DOCTYPE html>
<html>
<head>
  <title>Login Page</title>
</head>
<body>
  <h1>发布会管理</h1>
  <form action="/login/" method="post">
    <label for="username">Username:</label>
    <input type="text" id="username" name="username" required><br><br>

    <label for="password">Password:</label>
    <input type="password" id="password" name="password" required><br><br>

    <button id="btn" type="submit">登录</button>
      {% csrf_token %}
  </form>
</body>

</html>

备注:

 CSRF verification failed. Request aborted.

 表格需要加一个 {% csrf_token %} 的标签。csrf 全称是 Cross Site Request Forgery。这是 Django 提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。

再次使用POST请求,可以看到客户端提交带有一个token值

 登录视图

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

# Create your views here.
def index(request):
    return render(request,"index.html")

def login(request):
    if request.method=='POST':
        username=request.POST.get("username",'')
        password=request.POST.get("password",'')
        if username=='admin' and password=="admin123":
            return HttpResponse("登录成功")
        else:
            return render(request,'index.html',context={'error':'username or password error!'})

向服务器提交请求时,服务器可以通过request获取用户提交值

如获取POST请求中提交的name为username的值

<input type="text" id="username" name="username" required><br><br>
request.POST["username"]  

或者 request.POST.get('username','')

获取请求名称:request.method 

这里用返回了一个字符串

return HttpResponse("登录成功")

 事件管理

模板页面

sign/templatesevent_manage.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Manage Page</title>
</head>
<body>
<h1>嗨 {{user}} 欢迎</h1>

</body>
</html>

视图函数

from django.http import HttpResponse, Http404,HttpResponseRedirect
from django.shortcuts import render

# Create your views here.
def index(request):
    return render(request,"index.html")

def login(request):
    if request.method=='POST':
        username=request.POST.get("username",'')
        password=request.POST.get("password",'')
        if username=='admin' and password=="admin123":
            response=HttpResponseRedirect('/event_manage/')
            response.set_cookie('user',username,3600)
            return response
        else:
            return render(request,'index.html',context={'error':'username or password error!'})

def event_manage(request):
    username=request.COOKIES.get('user','')
    return render(request,'event_manage.html',{"user":username})

httpresponserediect为重定向,登录后页面被重定向至实践管理页面

这里采用response.set_cookie方法为客户端设置了cookie user=username

使用request.COOKIES.get()方法获取到客户端访问时带的cookie。

如果想给模板传值,需要在render第三个参数提供字典,字段名:值,

在模板中采用双引号{{字段名}}读取返回值。

也可以使用session

response.session["user"]=username

要用sesssion需要创建django自带的数据表session

 控制台执行python manage.py migrate

 重新登陆,可以看到设置的sessionid

 使用django认证

创建一个admin用户,这里用的是django自带的管理员账号功能。

 运行项目,访问http://127.0.0.1:8000/admin

使用创建的账号登录,并创建一个user

 修改登录函数使用django的认证

 输入正确账号密码可以登录,输出不存在账号密码登录失败。

设置视图仅登录后可用

设置装饰loginrequired后,直接访问视图会报错

查询数据库展示列表

@login_required #必须登录才能访问这个视图函数
def event_manage(request):
    username=request.session.get('user','')
    event_list=Event.objects.all()
    print(event_list)
    return render(request,'event_manage.html',{"user":username,"events":event_list})

 使用 event_list=Event.objects.all()查询数据库所有数据

在render中将列表传给events

{% for event in events %}在模板中循环遍历列表,并根据字段名读取值。

实现搜索-模糊查询

@login_required
def search_name(request):#按照名称查询发布会
    if request.method == 'GET':
        search_name = request.GET.get('search_name')  # 获取搜索关键词
    username = request.session.get('user', '')
    event_list=Event.objects.filter(name__icontains=search_name)
    count = len(event_list)
    return render(request, 'event_manage.html', {"user": username, "events": event_list,"count":count})

需要注意,视图函数的入参来自于request.get中对应的html元素的name=search_name的传参,

使用Event.objects.filter 实现数据过滤,且使用name__icontains 对关键字name进行模糊匹配。

(要在 Django 中实现模糊查询数据库数据,您可以使用 icontains 运算符在查询中进行模糊匹配。)

完成签到功能

sign加链接,

 添加url

url(r'^sign_index/(?P<eid>[0-9]+)/$',views.sign_index)

使用了 ^ 来匹配 URL 的起始位置,$ 来匹配 URL 的结束位置,[0-9]+ 来匹配一个或多个数字,并使用捕获组 (?P<eid>[0-9]+) 来提取数字并将其作为参数 eid

这意味着,当访问类似于 /sign_index_action/1/ 这样的URL时,它将匹配到这个路由,并将 1提取为 eid 的值传递给 views.sign_index视图函数进行处理

target里的{{event.id}}_blank表示打开新的标签页面。

视图函数sign_index

@login_required()
def sign_index(request,eid):
    event=get_object_or_404(Event,id=eid)
   
    return render(request,'sign_index.html',{'event':event})

get_object_or_404会在Event表里查找id为eid的值,如果找不到,返回404页面。

注意:从get方法中取值,直接用参数传入即可。 

 get_object_or_404 

`get_object_or_404` 是 Django 框架中的一个实用函数。它用于从数据库中获取单个对象,在未找到对象的情况下会抛出404错误。

使用 `get_object_or_404` 函数可以简化视图函数中的错误处理,并在找不到对象时直接返回404页面。以下是该函数的用法示例:

```python
from django.shortcuts import get_object_or_404
from myapp.models import MyModel

def my_view(request, object_id):
    obj = get_object_or_404(MyModel, pk=object_id)
    # 如果找到了对象,继续处理
    # 如果未找到对象,会直接抛出Http404异常
    
    # 其他处理代码...
```

在上面的示例中,`get_object_or_404` 函数接受两个参数:模型类和查询条件。在这里,我们通过 `MyModel` 模型类和主键 `pk=object_id` 来查询具体的对象。

如果找到了对象,将返回该对象;如果未找到对象,该函数将抛出 `django.http.Http404` 异常,然后Django将呈现404错误页面。

请注意,`get_object_or_404` 函数基于模型的 `get` 方法实现,并在未找到对象时自动引发异常,以便进行适当的错误处理。因此,使用它可以简化您的代码并提高代码的可读性。

值得注意的是,为了使用 `get_object_or_404` 函数,您需要导入 `django.shortcuts` 模块,并根据您的具体应用程序的模型进行调整。

模板sign_index

sign_index页面如下:

 

视图函数sign_index_action

签到功能:

1、输入正确手机号,查询Guest表是否有手机号,不存在则返回error

2、手机号和发布会id匹配,如果不存在则返回error

3、如果用户已签到,则返回已签到

4、如果用户未签到,则更新签到状态为1 

@login_required()
def sign_index_action(request,eid):
    event = get_object_or_404(Event, id=eid)
    phone=request.POST.get("phone")
    result=Guest.objects.filter(phone=phone)
    if not result:
        return render(request,'sign_index.html',{'event':event,'hint':'phone error'})
    result=Guest.objects.filter(phone=phone,event_id=eid)
    if not result:
        return render(request, 'sign_index.html', {'event': event, 'hint': 'event id or phone error'})
    result = Guest.objects.get(phone=phone, event_id=eid)
    if result.sign:
        return render(request, 'sign_index.html', {'event': event, 'hint': 'user has sign in'})
    else:
        Guest.objects.filter(phone=phone, event_id=eid).update(sign='1')
        return render(request, 'sign_index.html', {'event': event, 'hint': 'sign in success','guest':result})
Guest.objects.filter(phone=phone, event_id=eid).update(sign='1') 即将sign设置为1

 

filter和get方法区别

`filter()` 和 `get()` 是 Django ORM(对象关系映射)的查询方法,用于从数据库中检索对象。它们的区别在于返回结果的方式和处理的方式。

- `filter()` 方法返回一个查询集(QuerySet),这是一个包含符合条件的多个对象的可迭代对象。即使查询结果为空,也会返回一个空的查询集。您可以对查询集进行进一步的筛选、排序和操作。

例子:

```python
result = Guest.objects.filter(phone=phone, event_id=eid)
```

在上面的代码中,`filter()` 方法用于根据给定的条件筛选 `Guest` 模型的对象,它将返回满足条件的所有对象的查询集。您可以通过迭代查询集或使用其他查询集方法来进一步处理这些对象。

- `get()` 方法返回一个满足给定条件的单个对象。如果找到多个对象或者没有找到对象,`get()` 方法将引发 `Guest.DoesNotExist` 或 `Guest.MultipleObjectsReturned` 异常。因此,`get()` 方法适用于您确定只有一个对象满足条件的情况。

例子:

```python
result = Guest.objects.get(phone=phone, event_id=eid)
```

在上面的代码中,`get()` 方法用于检索满足给定条件的单个 `Guest` 模型的对象。注意,如果找不到满足条件的对象,将引发异常。

总结:
- 使用 `filter()` 方法可以返回符合条件的多个对象的查询集,适用于需要处理多个对象的情况。
- 使用 `get()` 方法可以返回满足给定条件的单个对象,适用于确定只有一个对象满足条件的情况。

根据具体需求,选择适合的方法以检索和处理数据库中的对象。

if not用法

`if not a` 是 Python 中的条件语句,用于判断一个值是否为 False 或者为空。

具体解释如下:
- 如果 `a` 的值为 False,例如 `a` 是 False、None、0、空字符串 ""、空列表 []、空字典 {}、空元组 () 或者空集合 set(),则条件为真。
- 如果 `a` 的值为 True,例如 `a` 是非零数字、非空字符串、非空列表、非空字典、非空元组或非空集合,或者任何其他对象,条件为假。

因此,`if not a` 的意思是如果 `a` 的值为 False 或者为空,执行条件下面的代码块。以下示例演示了 `if not a` 的使用:

```python
a = False
if not a:
    print("a is False or empty")

b = ""
if not b:
    print("b is False or empty")

c = [1, 2, 3]
if not c:
    print("c is False or empty")

d = 10
if not d:
    print("d is False or empty")

e = None
if not e:
    print("e is False or empty")
```

输出:
```
a is False or empty
b is False or empty
```

在上述示例中,我们使用 `if not` 条件来判断变量 `a`、`b`、`c`、`d` 和 `e` 是否为 False 或者为空。根据每个变量的值,相应的条件判断为真,并输出相应的结果。

请注意,可以根据实际情况谨慎使用 `if not a` 条件,并确保理解变量的不同可能取值,以便正确处理条件分支。

实现退出登录

@login_required()
def logout(request):
    # if request.method == 'POST':
    #     username = request.POST.get("username", '')
    #     user = auth.authenticate(username=username)
    #     auth.logout()
    auth.logout(request)
    return HttpResponseRedirect('/index/')

auth模块提供了退出登录的方法,直接调用,然后重定向到首页。

总结

本文使用django完成了一个简单的发布会签到系统,用到了模型,视图,模板,django认证系统等功能,能够对django知识有一个基础了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值