zoukankan      html  css  js  c++  java
  • Django的学习(五)————实战问题

    一、多参数问题:

    首先是在添加一个新的参数,其次在url中把这个id传递过去

    1 def article_page(request, article_id):
    2     article = models.Article.objects.get(pk=article_id)
    3     return render(request, 'blog/article_page.html', {'article': article})

    对于django2.0+的版本而言,使用正则匹配的时候需要导入re_path

     1 """
     2     this py file is copy from the file of name is myblog
     3 """
     4 from django.urls import path, re_path
     5 from django.conf.urls import url
     6 from . import views
     7 
     8 # 2.0版本以后用re_path来创建
     9 urlpatterns = [
    10     re_path(r'article/(d)', views.article_page),
    11     re_path(r'article', views.index),
    12 
    13 ]

    将正则的内容括起来进行书写。

    优化正则匹配,注意P是大写不是小写,且这个组名必须和添加到参数名保持一致。

    1 urlpatterns = [
    2     re_path(r'article/(?P<article_id>[0-9]+)', views.article_page),
    3     re_path(r'article', views.index),
    4 
    5 ]

    二、创建url的响应对象:

     1 """
     2     this py file is copy from the file of name is myblog
     3 """
     4 from django.urls import path, re_path
     5 from django.conf.urls import url
     6 from . import views
     7 
     8 # 2.0版本以后用re_path来创建
     9 urlpatterns = [
    10     re_path(r'article/(d)', views.article_page),
    11     re_path(r'article', views.index),
    12 
    13 ]

    三、超链接目标地址:

    在django2.0+的版本中,app_name需要指出来:

    1 app_name = 'blog'2 urlpatterns = [
    3     re_path(r'article/(?P<article_id>[0-9]+)', views.article_page, name='article_page'),
    4     re_path(r'index', views.index),
    5 ]

    注意:2.0+的版本中,要在使用name参数的url中添加app_name='blog',即应用名,否则后面的内容就会报错。因为这个是后遗症。

    template中可以使用"{% url  'app_name:url_name'  param %}"来完成对应的url的跳转。

    其中app_name是应用名,url_name是目标网址,param是地址的参数。

    url函数名称的位置参数:

      1.根urls,写在include()的第二个参数的位置,namespace='blog'

      2.应用下的则写在url()的第三个参数的位置,name='article'

    主要取决于是否使用include引用了另一个url的配置文件

    四、博客撰写界面:

    1.编辑界面函数:

    与原来的响应的方法一样:

     1 """
     2     this py file is copy from the file of name is myblog
     3 """
     4 from django.urls import path, re_path
     5 from django.conf.urls import url
     6 from . import views
     7 
     8 # 2.0版本以后用re_path来创建
     9 app_name = 'blog'
    10 urlpatterns = [
    11     re_path(r'^index/$', views.index),
    12     re_path(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),
    13     re_path(r'^edit/$', views.edit_page),
    14 ]

    2.编辑响应函数:

    用request.POST['参数名']获取表单数据,get也是一样的。

    和数据库的操作用的是models的类,所以用:

    models.Article.objects.create(title, content)创建对象。

    在后台中添加edit_action的响应函数:

    1 def edit_action(request):
    2     title = request.POST.get('title', 'TITLE')
    3     content = request.POST.get('content', 'CONTENT')
    4     models.Article.objects.create(title=title, content=content)
    5     articles = models.Article.objects.all()
    6     return render(request, 'blog/index.html', {"articles": articles})

    在前端的响应界面:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Edit_page</title>
     6 </head>
     7 <body>
     8 <form action="{% url 'blog:edit_action' %}" method="post">
     9     {% csrf_token %}
    10     <label>文章标题
    11         <input type="text" name="title"/>
    12     </label>
    13     <br/>
    14     <label>文章内容
    15         <input type="text" name="content"/>
    16     </label>
    17     <br/>
    18     <input type="submit" value="提交">
    19 </form>
    20 </body>
    21 </html>

    在对应的响应中添加对应的后台响应函数。

    注意:用post请求时,需要加上{% csrf_token%},因为django的安全性能好,所以这样才可以识别。

    3.编辑修改响应的函数:

    首先是编辑页面,由于在数据库中的存贮是从一开始的,所以我们在edit的编辑页面用的0。

    view函数:

    1 def edit_page(request, article_id):
    2     if str(article_id) == '0':
    3         return render(request, 'blog/edit_page.html')
    4     article = models.Article.objects.get(pk=article_id)
    5     return render(request, 'blog/edit_page.html', {'article': article})

    urls函数:

    1 app_name = 'blog'
    2 urlpatterns = [
    3     re_path(r'^index/$', views.index),
    4     re_path(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),
    5     re_path(r'^edit/(?P<article_id>[0-9]+)$', views.edit_page, name='edit_page'),
    6     re_path(r'^edit/action$', views.edit_action, name='edit_action'),
    7 ]

    在html文件中默认一个输入的id,在后端获取这个id,如果id为0则返回初始页面。如果id不为0返回对象,分别给对象赋值。

    article.title = title

    article.save()

  • 相关阅读:
    NOIP2016——组合数问题
    BZOJ3450——Tyvj1952(OSU?)
    洛谷4316——绿豆蛙的归宿(期望)
    BZOJ1997——次小生成树(严格次小生成树)
    USACO2002-OPEN-GREEN(GREEN秘密的牛奶管道SECRET)
    Linux系统应急响应
    Linux系统登录相关
    (翻译)Attacking Interoperability(攻击互操作性)in Black Hat 2009 研究报告
    HTTP参数污染(HPP)漏洞
    逻辑漏洞之越权访问漏洞
  • 原文地址:https://www.cnblogs.com/future-dream/p/10390450.html
Copyright © 2011-2022 走看看