怎样获取文章唯一标识
在view里定义
def article_detail(request,article_id):
return HttpResponse("文章id:%s"% article_id)
前边注意引用HttpReponse
在url里定义
path('article/<int:article_id>',article_detail,name="article_id"),
这时运行起来会显示这样的
其中的id可以更改
接下来通过id显示文章内容
这时就需要用到一个django模型配套的东西,引用models里边的模型(Article)
接下来通过模型id找到对应的内容,此时需要涉及到另一个东西,objects
那么在article/views里
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("not exist") #raise抛出去的意思
return HttpResponse("<h2>文章标题:%s</h2> <br>文章内容:%s"%(article.title ,article.content))
其中呢,要是想加入HTML代码修饰的话,则需要引入一个代码块
使用模板
前端页面和后端代码分离,降低耦合性
在template文件夹里创建html文件
返回模板的话需要用到render函数
那么之前代码里的这一句就可以注释掉或者删掉
return HttpResponse("<h2>文章标题:%s</h2> <br>文章内容:%s"%(article.title ,article.content))
代码就会改成
def article_detail(request,article_id):
try:
article = Article.objects.get(id = article_id)
context = {}
context ['article_obj'] = article
return render(request,"article_detail.html",context)
except Article.DoesNotExist:
raise Http404("not exist") #raise抛出去的意思
# return HttpResponse("<h2>文章标题:%s</h2> <br>文章内容:%s"%(article.title ,article.content))
另外呢,还有另外一种方法表示,即使用get_object_or_404模板
这个模板的定义在python安装目录里
()里填写模型和条件即可
改之后的代码即为
from django.shortcuts import get_object_or_404 #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)
article = get_object_or_404(Article,pk=article_id)#pk即为主键的缩写
context = {}
context ['article_obj'] = article
return render(request,"article_detail.html",context)
# except Article.DoesNotExist:
# raise Http404("not exist") #raise抛出去的意思
# return HttpResponse("<h2>文章标题:%s</h2> <br>文章内容:%s"%(article.title ,article.content))
获取文章列表
需要创建一个专门的处理方法
再次def一个article_list,同时在url里定义一下
def article_list(request):
articles = Article.objects.all()
context = {}#创建一个字典
context ['articles'] = articles
return render(request, "article_list.html", context)
在总url里定义一下
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
path('article/<int:article_id>',article_detail,name="article_detail"),
path('article/',article_list,name="article_list"),
]
其实呢,这个url其实是article里的url,那么我们就可以把它放到article里的url里
注意,article里没有url文件,所以需要再重新创建一个
创建后的url文件内容如下
from django.urls import path
from . import views #此时的views在同一目录下,用"."结构引用就行
urlpatterns = [
path('<int:article_id>',views.article_detail,name="article_detail"),
path('',views.article_list,name="article_list"),#注意,之前的 ('' )是包含有article的,路径和总url里的路径重复了,所以这里就不能再写了
]
总url文件里的代码如下
from django.contrib import admin
from django.urls import include ,path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/',views.index),
path('article/',include('article.urls')),#使用include函数,引用app里的url,前边定义有article路径,所以在app路径里就不再需要写这个article路径
]