Python-简易博客搭建

简易博客设计

目录

简易博客设计

页面概要

Django中的超链接

Templates过滤器

Django Shell

Admin补充


页面概要

  1. 博客主页面
    1. 文章标题列表,超链接
    2. 发标博客的按钮,超链接
  2. 博客文章内容页面
    1. 标题
    2. 文章内容
    3. 修改文章按钮,超链接
  3. 博客撰写页面
    1. 标题编辑栏
    2. 文章内容编辑区域
    3. 提交按钮

 

  • 博客主页面编写思路
    • 取出数据库中所有文章对象
    • 将文章对象们打包成列表,传递到前端
    • 前端页面把文章以标题超链接的形式逐个列出

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)

效果:

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值