Django(7)-项目实战-发布会管理

这篇具有很好参考价值的文章主要介绍了Django(7)-项目实战-发布会管理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

Django(7)-项目实战-发布会管理,Django,python,django

Django(7)-项目实战-发布会管理,Django,python,django

Django(7)-项目实战-发布会管理,Django,python,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.

Django(7)-项目实战-发布会管理,Django,python,django

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

Django(7)-项目实战-发布会管理,Django,python,django

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

Django(7)-项目实战-发布会管理,Django,python,django

 登录视图

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为重定向,登录后页面被重定向至实践管理页面

Django(7)-项目实战-发布会管理,Django,python,django

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

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

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

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

也可以使用session

response.session["user"]=username

Django(7)-项目实战-发布会管理,Django,python,django

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

 控制台执行python manage.py migrate

Django(7)-项目实战-发布会管理,Django,python,django

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

Django(7)-项目实战-发布会管理,Django,python,django

 使用django认证

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

Django(7)-项目实战-发布会管理,Django,python,django

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

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

Django(7)-项目实战-发布会管理,Django,python,django

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

Django(7)-项目实战-发布会管理,Django,python,django

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

设置视图仅登录后可用

Django(7)-项目实战-发布会管理,Django,python,django

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

Django(7)-项目实战-发布会管理,Django,python,django

查询数据库展示列表

Django(7)-项目实战-发布会管理,Django,python,django

@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

Django(7)-项目实战-发布会管理,Django,python,django

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

实现搜索-模糊查询

Django(7)-项目实战-发布会管理,Django,python,django

@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加链接,

Django(7)-项目实战-发布会管理,Django,python,django

Django(7)-项目实战-发布会管理,Django,python,django

 添加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页面如下:

Django(7)-项目实战-发布会管理,Django,python,django

 Django(7)-项目实战-发布会管理,Django,python,django

视图函数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

 Django(7)-项目实战-发布会管理,Django,python,django

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知识有一个基础了解。文章来源地址https://www.toymoban.com/news/detail-678612.html

到了这里,关于Django(7)-项目实战-发布会管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • BSN实名DID服务发布会在北京召开

    BSN实名DID服务发布会在北京召开

    12月12日,由国家信息中心、公安部第一研究所联合主办,中国移动通信集团有限公司、区块链服务网络(BSN)发展联盟、中关村安信网络身份认证产业联盟(OIDAA)承办的“BSN实名DID服务发布会”在北京召开,会上正式发布了BSN实名DID服务。国家信息中心主任徐强、公安部第

    2024年02月04日
    浏览(9)
  • 发布会前准备新闻通稿的重要性,为什么媒体不会原稿发布报道?

    发布会前准备新闻通稿的重要性,为什么媒体不会原稿发布报道?

    传媒如春雨,润物细无声,大家好,我是51媒体 胡老师。 最近有宣传的小伙伴问胡老师,为什么我们精心准备的新闻通稿,媒体没有按照稿子发布呢?今天就与大家交流下这方面的经验。 一,发布会前准备新闻通稿的重要性在于: 1.首先发布会前准备准备新闻通稿在向媒体

    2023年04月24日
    浏览(13)
  • 百度版ChatGPT:文心一言发布会盛大召开!

    百度版ChatGPT:文心一言发布会盛大召开!

    今天下午2点,万众期待的百度版ChatGPT:文心一言发布会召开了。(图一) 投资者对这个发布会的反应非常直接:股价当场断崖式下跌。(图二) 和ChatGPT发布会上现场功能演示不同,百度发布会的所有功能演示都是提前录制好的,而且也不对大众开放,只能面向企业用户申

    2024年02月10日
    浏览(12)
  • 定档11月2日,YashanDB 2023年度发布会即将启航

    定档11月2日,YashanDB 2023年度发布会即将启航

    数据库作为支撑核心业务的关键技术,对数字经济的发展有着重要的支撑作用,随着云计算、AI等技术的迅猛发展和数据量的爆发式增长,推动着数据库技术的加速创新。 为了应对用户日益复杂的数据管理需求,赋能行业国产化建设和数字化转型,深圳计算科学研究院(简称

    2024年02月08日
    浏览(11)
  • ​倒计时5天 | AIGC拓世大模型发布会亮点抢先看!

    ​倒计时5天 | AIGC拓世大模型发布会亮点抢先看!

    探索人工智能的未来, 抢先一步洞悉行业趋势! AIGC拓世大模型发布会即将在南昌举行 这场汇聚AI专家与行业领袖的盛会,将以其专业性和创新性震撼全场。 作为人工智能领域独一无二的盛事,本次大会将为与会者带来全面的行业洞察和前沿知识。 数百位AI领域的大咖将云集

    2024年02月08日
    浏览(10)
  • 倒计时1天 | 袋鼠云春季发布会完整议程出炉!快快预约直播

    倒计时1天 | 袋鼠云春季发布会完整议程出炉!快快预约直播

    在日新月异的数字化经济时代,企业和组织不断寻求利用先进技术构建自身的核心竞争力。其中,大数据与AI的深度融合正在成为推动企业实现新质生产力的关键路径。 在此背景下,袋鼠云举办春季发布会,以“Data+AI,构建新质生产力”为主题,旨在深度探讨如何将数据与

    2024年04月09日
    浏览(9)
  • 文心一言发布会李彦宏:开发模式会巨变 MAAS - 模型即服务

    文心一言发布会李彦宏:开发模式会巨变 MAAS - 模型即服务

    本文仅代表作者观点 今天在文心一言发布会现场,李提到了: MAAS ,模型即服务 可能大家有的人很难理解  这里提到的 MAAS 即:模型即服务 那么肯定是跟商业化挂钩的,之前像有一些概念:SAAS,平台即服务 这里可以预研到,接下来MAAS的概念会火起来,实际上现在已经火起来

    2024年02月09日
    浏览(12)
  • 袋鼠云春季发布会圆满落幕,构建Data+AI新质生产力

    袋鼠云春季发布会圆满落幕,构建Data+AI新质生产力

    4月10日,以“Data+AI,构建新质生产力”为主题的袋鼠云春季发布会圆满落幕。大会中,袋鼠云带来了一系列“+AI”的数字化产品与最新行业沉淀,旨在将数据与AI紧密结合,打破传统的生产力边界,赋能企业实现更高质量、更高效率的数字化发展。 《行业指标体系白皮书》:

    2024年04月11日
    浏览(43)
  • “冰箭卫士·IP发布会”首次亮相第14届海峡两岸(厦门)文博会

    “冰箭卫士·IP发布会”首次亮相第14届海峡两岸(厦门)文博会

    2023年8月6日,“冰箭卫士·IP发布会”首次亮相海峡两岸文博会思明馆。此次发布会由厦门市文化创意产业协会、厦门理工(集美区)政产学研基地主办,厦门市文化创意产业协会IP设计研究院、厦门一笔之上文化发展有限公司、冰箭应急安全科技研究院承办。发布会由厦门市文

    2024年02月12日
    浏览(9)
  • 看完天才少年稚辉君智元机器人发布会后的一点感受

    看完天才少年稚辉君智元机器人发布会后的一点感受

    (点击即可收听) 智辉君,在科技圈里是一位非常有名的技术大佬,华为天才少年,年入百万招入,破圈于B站 人称科技圈里的野生钢铁侠 ,凡是看过他B站里一些科技硬核作品,外行人看了直呼666,内行人看了惊掉下巴,mini电视机,自动驾驶自行车,给葡萄穿线的机械臂,客

    2024年02月12日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包