1.创建文章
在项目管理界面添加3个文章,标题分别为1,2,3并输入对应内容如:111,222,333。添加后管理界面如下:
2.访问文章信息
打开article文件下的views.py输入以下内容:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def article_detail(request, artticle_id):
return HttpResponse("文章id:%d", artticle_id)
页面创建完成后在urls.py中加入地址:
urlpatterns = [
path('admin/', admin.site.urls),
path('', view.index),
path('article/<int:article_id>', article_detail), name='article_detail'
]
其中 <int:article_id>表示传进来的变量为int类型变量名为article_id。name='article_detail’为别名。
在项目目录运行服务,并在浏览器地址输入对应地址,如:
http://127.0.0.1:8000/article/+任意数字,即可输出对应数字。
此时输入的值为地址传递的值,并没有与后台对应文章id相对应。
现在来对后台的数据进行链接
在views.py文件中修改内容。
from .models import Article
# Create your views here.
def article_detail(request, article_id):
article = Article.objects.get(id=article_id)
return HttpResponse("<h2>文章标题:%s</h2> <br> 文章内容:%s" % (article.title, article.content))
此时,传递进来的文章id与后台文章相对应,在浏览器输入对应id地址即可输出对应文章id和内容,若id不存在就会相应报错。
注意: 在输出内容时,用 \n 并不能实现换行,因为时html所以要使用
来换行。同理,在标题前加上<h2>也为html标签。
3.处理异常
若在浏览器地址中输入了后台中不存在的id,会出现报错,如图:
进一步优化,来添加一个处理异常的代码:
from django.shortcuts import render
from django.http import HttpResponse, Http404
from .models import Article
# Create your views here.
def article_detail(request, article_id):
try:
article = Article.objects.get(id=article_id)
except Article.DoesNotExist:
raise Http404("不存在!")
return HttpResponse("<h2>文章标题:%s</h2> <br> 文章内容:%s" % (article.title, article.content))
这样,即实现了异常处理,如图:
4.前后端分离,降低耦合性
在views.py文件目录下新建文件夹,文件夹名为templates必须为这个文件夹名,在setting.py中有规定:
在该文件夹下创建html文件,定义文件名为article_detail.html,这个名字可自定义。
接下来在views.py中进行修改使其可进行跳转到对应的html页面:
from django.shortcuts import render_to_response
from django.http import Http404
from .models import Article
# Create your views here.
def article_detail(request, article_id):
try:
article = Article.objects.get(id=article_id)
context = {}
context['article_obj'] = article
return render_to_response('article_detail.html', context)
except Article.DoesNotExist:
raise Http404("不存在!")
使用render_to_response()方法来进行跳转及传递变量。
此时,即实现了前后端分离的效果。
5.代码简化
使用404的另一种表达方式,导入包get_object_or_404
get_object_or_404(klass, *args, **kwargs)
其中,参数含义:
klass
接受一个 Model 类,Manager 或 QuerySet 实例,表示你要对该对象进行查询。
**kwargs
查询条件,格式需要被 get() 和 filter() 接受。
再次修改views.py文件:
from django.shortcuts import render_to_response, get_object_or_404
from .models import Article
# Create your views here.
def article_detail(request, article_id):
article = get_object_or_404(Article, pk=article_id)
context = {}
context['article_obj'] = article
return render_to_response('article_detail.html', context)
在get_object_or_404中,pk代表第三个参数的缩写。
这样就完成了代码简化。
6.获取文章列表
首先在templates中创建html文件,这里名为article_list
然后,在views.py中添加函数设置跳转:
def article_list(request):
articles = Article.objects.all()
context = {}
context['articles'] = articles
return render_to_response('article_list.html', context)
在urls.py中注册页面:
from django.contrib import admin
from django.urls import path
from .import view
from article.views import article_detail, article_list
urlpatterns = [
path('admin/', admin.site.urls),
path('', view.index),
path('article/<int:article_id>', article_detail, name='article_detail'),
path('article/', article_list, name='article_list')
]
在html中如果单单使用articles会出现以下内容:
是个列表形式,所以要将其进行遍历,这里使用for循环。
在这里使用for循环用此形式:
{% for article in articles %}
<p>{{ article.title }}</p>
{% endfor %}
这样即可达到查看文章列表效果:
7.实现对应链接跳转
在article_list.html中添加以下内容:
{% for article in articles %}
<a href="{% url 'article_detail' article.pk %}">{{ article.title }}</a>
{% endfor %}
其中url后面引号里的内容为跳转链接的name的值,是在urls.py中提前设置的,如图:
这样就实现了对应标题跳转对应页面的功能。
8.简化urls.py中的内容
简化urls.py的内容,使用总urls管理app的urls
下面是urls.py的内容:
from django.contrib import admin
from django.urls import path
from .import view
from article.views import article_detail, article_list
urlpatterns = [
path('admin/', admin.site.urls),
path('', view.index),
path('article/<int:article_id>', article_detail, name='article_detail'),
path('article/', article_list, name='article_list')
一个项目,会有很多页面,如果全都在这个文件下添加,久而久之会变得杂乱,导致不容易管理。
在urlpatterns中第一个path中admin引用了一个文件。所以我们可以利用总的urls来管理其他的urls
在article文件夹中,新建文件 urls.py并编写内容:
from django.urls import path
from . import views
urlpatterns = [
path('<int:article_id>', views.article_detail, name='article_detail'),
path('', views.article_list, name='article_list')
]
接着在总的urls.py中添加include:
from django.contrib import admin
from django.urls import path, include
from .import view
urlpatterns = [
path('admin/', admin.site.urls),
path('', view.index),
path('article/', include('article.urls'))
]
这样,在article下的urls.py中的链接前缀就存在一个article/。