简易博客设计
目录
页面概要
- 博客主页面
- 文章标题列表,超链接
- 发标博客的按钮,超链接
- 博客文章内容页面
- 标题
- 文章内容
- 修改文章按钮,超链接
- 博客撰写页面
- 标题编辑栏
- 文章内容编辑区域
- 提交按钮
- 博客主页面编写思路
- 取出数据库中所有文章对象
- 将文章对象们打包成列表,传递到前端
- 前端页面把文章以标题超链接的形式逐个列出
tips
模板For循环
{% for xx in xxs %}
html语句
{% endfor %}
这个标表示获取Article对象数据,pk参数表示获取第几条
代码编写如下:
后台代码
views.py
def index(request):
# article = models.Article.objects.get(pk=2)
# return render(request, "ml_site/index3.html", {'article': article})
articles = models.Article.objects.all()
return render(request, "ml_site/index3.html", {'articles': articles})
前台代码
templates/ml_site/index3.html
<body>
<!--<h1>{{article.title}}</h1>-->
<!--<h3>{{article.content}}</h3>-->
<h1>
<a href="">新文章</a>
</h1>
{% for article in articles %}
<a href="">{{article.title}}</a><br/>
{% endfor %}
</body>
效果:如下图
- 博客文章页面编写思路
- 创建一个文章内容页面
- 点击主页面的超链接,传入article_id(文章在数据库中的primary key)
- 获取数据库文章对象
- 前端显示内容标题和文章内容
- 修改文章按钮超链接
- URL传递参数
- 参数卸载响应函数中request后,可以有默认值
- URL正则表达式 r'^article/(?P<article_id>[0-9]+)$‘
- URL正则中的组名不许可参数名一致
代码编写如下:
views.py
def article_page(request, article_id):
article = models.Article.objects.get(pk=article_id)
return render(request, "ml_site/article_page.html", {'article': article})
urls.py
urlpatterns = [
# path('index/', views.index),
url(r'^index/$', views.index),
# 下面的正则匹配 article_id(组名) 必须与上方中views.py的响应函数参数的article_id同名
url(r'^article/(?P<article_id>[0-9]+)$', views.article_page)
]
templates/ml_site/article_page.html
<body>
<h1>{{article.title}}</h1>
<h3>{{article.content}}</h3>
<br/>
<br/>
<a href="">修改文章</a>
</body>
效果如下图:
Django中的超链接
超链接目标地址
- href后面是目标地址
- template中可以用" {% url 'app_name:url_name' param %} "
- 其中app_name 和url_name都在url中配置
再配URL
url函数的名称参数
- 根urls,写在include()的第二个参数位置,namespace='ml_site'
- 应用下则写在url()的第三个参数位置,name = 'article_page' tips(高版本需要定义一个全局变量app_name = 'ml_site')
- 主要取决于是否使用include应用了另一个url配置文件
遇到的问题:https://blog.csdn.net/weixin_40841752/article/details/79335345
代码如下:
根urls.py
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^ml_site/', include('ml_site.urls', namespace='ml_site')),
url(r'^my_blog/', include('my_blog.urls')),
]
app中的urls.py tips(高版本需要定义一个全局变量app_name = 'ml_site')
app_name = 'ml_site'
urlpatterns = [
# path('index/', views.index),
url(r'^index/$', views.index),
url(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page')
]
templates/ml_site/index3.html
<body>
<!--<h1>{{article.title}}</h1>-->
<!--<h3>{{article.content}}</h3>-->
<h1>
<a href="">新文章</a>
</h1>
{% for article in articles %}
<a href="{% url 'ml_site:article_page' article.id %}">{{article.title}}</a><br/>
{% endfor %}
</body>
撰写页面
- 新建一个撰写页面的html,创建一个表单
templates/ml_site/edit_page.html
<body>
<form action="{% url 'ml_site:edit_action' %}" method="post">
{% csrf_token %}
<label>标题:
<input type="text" name="title"/></label><br/><br/>
<label>内容:
<input type="text" name="content"/></label><br/><br/>
<input type="submit" value="提交"/>
</form>
</body>
应用下的urls.py下面配置路径
urlpatterns = [
# path('index/', views.index),
url(r'^index/$', views.index),
url(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),
url(r'^edit/$', views.edit_page, name='edit_page'),
url(r'^edit/action/$', views.edit_action, name='edit_action')
]
编辑响应函数
- 使用request.POST['参数名']获取表单数据
- models.Article.objects.create(title,content)创建对象
应用下面的views.py
def edit_page(request):
return render(request, "ml_site/edit_page.html")
def edit_action(request):
title = request.POST.get('title', 'TITLE')
content = request.POST.get('content', 'CONTENT')
models.Article.objects.create(title=title, content=content)
articles = models.Article.objects.all()
return render(request, 'ml_site/index3.html', {'articles': articles})
遇到的问题:
跳转报错,一定记得添加url关键字
{% url 'ml_site:edit_action' %}
CSRF验证失败. 相应中断.
https://blog.csdn.net/little_monkey1223/article/details/76698070
修改文章页面(撰写文章页面修改)
思路:
- 新文章为空,修改文章有内容
- 修改文章页面有文章对象
- 文章ID
修改项目下views.py中的editpage方法:新增article_id参数
def edit_page(request, article_id):
# 判断是否有文章ID,如果没有,则跳转到新增文章页面;有,则跳转到文章修改页面
if str(article_id) == '0':
return render(request, "ml_site/edit_page.html")
article = models.Article.objects.get(pk=article_id)
return render(request, "ml_site/edit_page.html", {'article': article})
修改应用下面的urls.py文件中editpage页面的配置
url(r'^edit/(?P<article_id>[0-9]+)$$', views.edit_page, name='edit_page'),
修改文章编辑页面templates/ml_site/edit_page.html 添加个article_id 的input
<form action="{% url 'ml_site:edit_action' %}" method="post">
{% csrf_token %}
{% if article %}
<input type="hidden" name="article_id" value="{{article.id}}">
<label>标题:
<input type="text" name="title" value="{{article.title}}"/></label><br/><br/>
<label>内容:
<input type="text" name="content" value="{{article.content}}"/></label><br/><br/>
{% else %}
<input type="hidden" name="article_id" value="0">
<label>标题:
<input type="text" name="title"/></label><br/><br/>
<label>内容:
<input type="text" name="content"/></label><br/><br/>
{% endif %}
<input type="submit" value="提交"/>
</form>
修改应用中的views.py 新增文章内容判断
def edit_action(request):
title = request.POST.get('title', 'TITLE')
content = request.POST.get('content', 'CONTENT')
article_id = request.POST.get('article_id', '0')
if article_id == '0':
models.Article.objects.create(title=title, content=content)
articles = models.Article.objects.all()
return render(request, 'ml_site/index3.html', {'articles': articles})
article = models.Article.objects.get(pk=article_id)
article.title = title
article.content = content
article.save()
return render(request, "ml_site/article_page.html", {'article': article})
Templates过滤器
什么是过滤器?
- 写在模板中,数据Django模板语言
- 可以修改模板中的变量,从而显示不同的内容
怎么使用过滤器?
- {{ value|filter }} 例子:{{ list_nums|length }}
- 过滤器可叠加:{{ value|filter1|filter2|filter3.... }}
使用过滤器改进博客代码,减少冗余代码
修改应用下的templates/ml_site/edit_page.html
<form action="{% url 'ml_site:edit_action' %}" method="post">
{% csrf_token %}
<input type="hidden" name="article_id" value="{{article.id|default:'0'}}">
<label>标题:
<input type="text" name="title" value="{{article.title}}"/></label><br/><br/>
<label>内容:
<input type="text" name="content" value="{{article.content}}"/></label><br/><br/>
<input type="submit" value="提交"/>
</form>
Django Shell
什么是Django Shell?
-
- 它是一个Python的交互式命令行程序
- 它自动引入了我们的项目环境
- 我们可以使用它与我们的项目进行交互
如何使用Django Shell?(直接就可以查询我们的数据)
- python manage.py shell
- from ml_site.models import Article
- Article.objects.all()
有什么用?
- 我们可以使用Django shell来进行一些调试工作
- 测试未知方法
Admin补充
给添加后台Article添加内容展示(显示其他的字段)
修改应用名下面的admin.py
class ArticleAdmin(admin.ModelAdmin):
# list_display同时支持tuple和list,
list_display = ('title', 'content')
admin.site.register(Article, ArticleAdmin)
效果:
给Article类新增发布日期()
数据库字段变化,需要执行数据移植命令
- python manage.py makemigrations
- python manage.py migrate
效果:
过滤器
list_filter = ('pub_time',) # 单个元素的元组,记得末尾添加个,
在应用中的admin.py中添加过滤器
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'content', 'pub_time')
list_filter = ('pub_time',)
admin.site.register(Article, ArticleAdmin)
效果: