Django笔记

django搭建blog网址

访问权限

ALLOWED_HOSTS = ['*']

数据库设置

DATABASES = {              
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog',
        'USER':'root',
        'PASSWORD':'1234',
        'HOST':'127.0.0.1',
        'POST':'3306',
    }
}

地区时间

LANGUAGE_CODE = 'zh-hans'   #语言修改为中文

TIME_ZONE = 'Asia/Shanghai'

数据库迁移

python manage.py makemigrations
python manage.py migrate

创建管理帐号和密码

python manage.py createsuperuser

启动Django项目

python manage.py runserver

静态文件查找

STATICFILES_DIRS = (					#`DTL`会在这个列表的路径中查找静态文件
    os.path.join(BASE_DIR, 'static'),
)

配置全局后,在页面中不需要使用 {% load static %} 进行导入了 TEMPLATES/OPTIONS

{% load static %}				#表明该模板下的这一块内容将有可能被子模板覆盖。
'builtins': ['django.templatetags.static'] ,

前端

{% include 'head.html' %}
<div>中部</div>
{% include 'footer.html' %}

相同的代码单独提取出来放在 base.html页面里,然后在代码不同的位置,也就是主体那里用模板标签{% block content %} {% endblock %}替换。

templates/base.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MyBlog</title>
</head>
<body>
<div>头部</div>

{% block content %}		#content可以自由命名

{% endblock %}

<div>尾部</div>

</div>
</body>
</html>

组合成一个完整的首页

templates/index.html

{% extends "base.html" %}  #继承 base.html页面的代,使用继承方法的话,这个代码一定要放页面的第一行。
{% include 'head.html' %}

{% block content %}
<div>中部</div>
{% endblock %}

{% include 'footer.html' %}

调用url

{% url 'xxx' %}  #xxx为别名 网站首页就是{% url 'index' %}

自动找到模板

'DIRS': [os.path.join(BASE_DIR, 'templates')]		#TEMPLATES中

导出数据

python manage.py dumpdata > data.json

导入数据

python manage.py loaddata data.json

自己做欢迎页面

myblog/blog/views.py

from django.http import HttpResponse

def hello(request):
    return HttpResponse('欢迎使用Django!')
myblog/myblog/urls.py

from django.contrib import admin
from django.urls import path
from blog import views         #+ 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.hello),   #+
]

ORM

Here, each model is represented by a class that subclasses django.db.models.Model. 
在这里,每个模型都由一个类表示,该类是django.db.models.model的子类。
CharField:字符串类型,映射到数据库中会转换成varchar类型,使用时必须传入max_length属性以定义该字符串的最大长度,如果超过254个字符,就不建议使用CharField了,此时建议使用TextField。

ManyToManyField(多对多)

class Meta:
    verbose_name = '少的是内部'
    verbose_name_plural = '多的是外部'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6gyfz0O-1582777788685)(C:\Users\xiaocai\AppData\Roaming\Typora\typora-user-images\image-20200227114925415.png)]

null 数据库中字段是否可以为空(null=True)

default 数据库中字段的默认值

null与blank的对比

  • null 是针对数据库而言,如果 null=True, 表示数据库的该字段可以为空。
  • blank 是针对表单的,如果 blank=True,表示你的表单填写该字段的时候可以不填 默认False

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mhb8OXry-1582777788686)(C:\Users\xiaocai\AppData\Roaming\Typora\typora-user-images\image-20200227115410064.png)]

后台

修改后台管理页面头部显示内容和页面标题

admin.site.site_header = '头部显示内容'
admin.site.site_title = '页面标题'

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin): 内部

文章列表里显示想要显示的字段
list_display = ('id', 'category','title', 'tui', 'user','views','created_time')
设置哪些字段可以点击进入编辑界面
list_display_links = ('title','views','created_time')# 设置哪些字段可以点击进入编辑界面 默认id
ist_display_links = ('name',)		#格式必须是list, a tuple, or None
list_display_links = ('name')		#不加,	报错
显示每个页面的记录条数
list_per_page = 50	# 	满50条数据就自动分页	   默认100
排序方式
ordering = ('-id',)	#后台数据列表排序方式 
The value of 'ordering' must be a list or tuple			-号表示降序
在列表里就可编辑字段
#list_editable 设置默认可编辑字段,在列表里就可以编辑
list_editable = ['title', 'user']
"操作选项"的设置
actions_on_top=True			#列表顶部,设置为False不在顶部显示,默认为True。
actions_on_bottom=False		#列表底部,设置为False不在底部显示,默认为False。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t9lLzlS9-1582777788686)(C:\Users\xiaocai\AppData\Roaming\Typora\typora-user-images\image-20200227113824345.png)]

定制Action行为具体方法
def func(self, request, queryset):
    queryset.update(created_time='2020-01-01')#将created_time字段的值设置为2020-01-01
        
func.short_description = "将发布时间设置为2020-01-01"
actions = [func, ]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1N6VuOoM-1582777788687)(C:\Users\xiaocai\AppData\Roaming\Typora\typora-user-images\image-20200227121209742.png)]

自定义列

在Model中定义一个方法

def riqi(self):
    return self.created_time.strftime("%b %d %Y %H:%M:%S")
riqi.short_description = '发布日期'		 # 设置方法字段在admin中显示的标题
riqi.admin_order_field='created_time'   #指定排序依据

在admin.py里把我们定义的方法加在list_display里

list_display = ('riqi',)
搜索框
search_fields=['title']		#指定标题title做为搜索字段

在这里插入图片描述
分层筛选

date_hierarchy = 'created_time'    # 详细时间分层筛选 

str

在这里插入图片描述在这里插入图片描述

url

添加DjangoUeditor的URL

path('ueditor/', include('DjangoUeditor.urls')), #没有改行代码编辑器里就上传不了图片

编辑器内容里可以显示上传的图片

re_path('^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),#增加此行

模板

urls.py
path('', views.index, name='index'),
views.py
def index(request):
    sitename = 'Django中文网'		#添加两个变量,并给它们赋值
    url = 'www.django.cn'
    context = {					  #把两个变量封装到上下文里
        'sitename': sitename,
        'url':url,
    }
    return render(request,'index.html',context)		 #把上下文传递到模板里
index.html
<h3>网站名:{{ sitename }}</h3>			{{变量名}}模板变量
<h3>域名:{{ url }}</h3>

例二

blog/views.py
def index(request):
    sitename = 'Django中文网'
    url = 'www.django.cn'
    #新加一个列表
    list=[
        '开发前的准备',
        '项目需求分析',
        '数据库设计分析',
        '创建项目',
        '基础配置',
        '欢迎页面',
        '创建数据库模型',
    ]
    context = {
        'sitename': sitename,
        'url':url, 
        'list':list, #把list封装到context
    }
    return render(request,'index.html',context)
<div>
    <ul>
    <h4>Blog教程目录:</h4>
        {% for list in list  %}
        <li>{{ list }}</li>k
        {% endfor %}
    </ul>
</div>
遍历输出变量
{{% for foo in list %}
{% endfor %}
字典
    mydict={
        'name': '吴秀峰',
        'qq': '445813',
        'wx': 'vipdjango',
        'email': '445813@qq.com',
        'Q群': '10218442',
    }
    context = {
        ...
        #把mydict封装到上下文
        'mydict':mydict,
    }
{% for key,values in mydict.items  %}
<li>{{ key }}{{ values }}</li>
{% endfor %}
数据查询
def index(request):
    #对Article进行声明并实例化,然后生成对象allarticle
    allarticle = Article.objects.all()
    #把查询到的对象,封装到上下文
    context = {
        'allarticle': allarticle,
    }
    #把上传文传到模板页面index.html里
    return render(request,'index.html',context)
<div>
    <ul>
    <h4>所有文章:</h4>
        {% for article in allarticle  %}
        <li>{{ article.title }}</li>
        {% endfor %}
    </ul>
</div>
locals()

locals()的作用是返回一个包含当前作用域里面的所有变量和它们的值的字典

在这里插入图片描述在这里插入图片描述

url分层模块化

在这里插入图片描述
book app下 urls 方便管理urls地址
在这里插入图片描述

反转

reverse 反转 从url中的name找到路径 避免跳转页面写死
在这里插入图片描述
之前urls中定义的name
在这里插入图片描述

应用命名空间

应用命名空间:多个app中可能有相同的name 反转的时候可能不知道哪一个

一个app下的urls中
在这里插入图片描述
或者在url下的urlpattern下指定
在这里插入图片描述)
views下
在这里插入图片描述

实例命名空间用法

若一个app有2个实例,你输入1个实例的地址,可能是跳转到另一个实例的地址
前提:要有应用命名空间
在这里插入图片描述
当前登录页面
在这里插入图片描述

re_path

在这里插入图片描述
re中定义一个参数或变量,要使用()进行包裹
给参数取名之?P<name>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于武沛齐的Django笔记中的Ajax请求部分,以下是一些常见的步骤和注意事项: 1. 在前端页面中,使用JavaScript编写一个Ajax请求。可以使用原生的XMLHttpRequest对象,也可以使用jQuery等库来简化操作。例如,使用jQuery的$.ajax()函数可以发送Ajax请求。 2. 在Django中,创建一个处理Ajax请求的视图函数。这个视图函数需要使用装饰器`@csrf_exempt`来取消跨站请求伪造保护。 3. 在视图函数中,可以通过`request.is_ajax()`方法来判断请求是否为Ajax请求。如果是Ajax请求,可以使用`request.POST`或`request.GET`来获取前端发送的数据。 4. 处理完请求后,可以返回JSON格式的数据给前端。可以使用Django提供的`JsonResponse`类来方便地返回JSON响应。 以下是一个简单的示例代码: 前端页面中的JavaScript代码: ```javascript $.ajax({ type: "POST", url: "/ajax-request-url/", data: { key1: value1, key2: value2 }, success: function(response) { // 处理成功响应的逻辑 }, error: function(xhr, status, error) { // 处理错误响应的逻辑 } }); ``` Django中的视图函数: ```python from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @csrf_exempt def ajax_request_view(request): if request.is_ajax(): key1 = request.POST.get('key1') key2 = request.POST.get('key2') # 处理数据逻辑 response_data = {'key': 'value'} return JsonResponse(response_data) else: return HttpResponseBadRequest("Bad Request") ``` 请注意,这只是一个简单的示例,实际的实现可能会根据具体需求有所不同。还请参考官方文档和其他资源以获取更详细的信息和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值