一、多参数问题:
首先是在添加一个新的参数,其次在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()
原文地址:https://www.cnblogs.com/future-dream/p/10390450.html