Django新手入门


视图view+模板template+模型model

python manager.py runserver [port]
python manager.py startapp [appname]

请求:

  • META
    • REMOTE_ADDR 请求的IP地址
    • HTTP_USER_AGENT 用户请求终端信息
  • Content-Type
    • text/plain 普通文档
    • text/xml XML文档
    • application/json json数据类型

视图:

接受请求返回响应

1.定义URL
 path(route,view,name,**kwargs)
 include(urls,namespace)
 
 #########示例#########
 path('sight/image/list/',SightImageView,name='SightImageView')
 path('account/',include('accounts.urls'))
2.获取URL参数
  1. url/path传参

  2. view视图取参

     re_path(r'(?P<arg>表达式)/',view,name)
     path('.../<int:arg>/',view,name)
     
     def uname_view(request,arg)
     
     #########示例#########
     path('article/<int:page>',article_list,name='article_list')
     def article_list(request,page)
     
     re_path(r'^article/(?P<month>0?[1-9]|1[012])/$',article_list,name='article_list')
     def article_list(request,month)
    
3.获取GET/POST参数
 request.GET.get('arg','')
 
 #########示例#########
 http:127.0.0.1:8080/?name=jinhu
 request.GET.get('name',None)
4.响应HTML

​ 磁盘读取+替换特殊字符+发送浏览器

 render(request,template_name,{})
 
 #########示例#########
 data = {
 	'name':'jinhu'
 }
 render(request,'hello.html',{
 	'data':data
 })
5.重定向
 redirect(route)
 
 #########示例#########
 redirect('user/login/')
6.静态文件
  • settings.py

     MEDIA_URL='/media/'
     MEDIA_ROOT=os.path.join(BASE_DIR,'medias')
    
  • urls.py

     urlpatterns += [
     	url(r'^media/(?P<path>.*)$,serve,{
     	'document_root':settings.MEDIA_ROOT
     	})
     ]
    
7.class重写视图
 url('hello/',HomeView.as_view(),name='hello')
 
 class HomeView(TemplateView):
 	template_name='hello.html'

模板

jinja2在jinja2文件夹,DTL在templates文件夹

{{ object.attribute }} {% tag %}

1.模板标签
  • 循环控制

    {% for item in data_list %}
    ...
    {% empty %} 或者 {% else %}
    ...
    {% endfo %}
    
    
    {% for key,value in data.items%}
    	{{ key }}:{{ value }}
    {% endfo %}
    
    {% cycle 'row1' 'row2' %} 或者 {{loop.cycle('row1','row2')}}
    
  • 条件控制

    {% if condition_a %}
    ...
    {% elfi condition_b %}
    ...
    {% else %}
    ..
    {% endif %}
    
  • URL解析

    {% url 'url_name' params %} 或者 {{url_for('index')}}
    
    {% load static %}
    <img src="{% static "image/cat.jpg" %}" alt="Cat">
    
  • 当前时间显示

    {% now "JS F Y H:i" %}
    
2.模板继承
  1. 基Html用block圈出

  2. 子Html用extends继承

  3. 子Html用super复用

    {% extends "base.html" %}
    {% block sidebar %}
    	{{ block.super }}
    {% endblock %}
    
3.添加公共
 {% include "footer.html" %}
4.过滤器

​ {{ value| filter_name:params }}

自定义过滤器

  1. 任意模块下新建templatetags的python包

  2. 内部新建脚本any_name.py

    register = template.Library()
    
    @register.filter(name='uname_format')
    def uname_format(text, len):
    	return f"{text[:len]}***"
    	
    {% load any_name %}
    {{ value|uname_format:2 }}
    

ORM模型:

1.元数据 Meta
  • db_table ordering verbose_name abstract
  • proxy 共享数据库表,添加新的方法、属性和管理器
2.关联关系
  • 一对一:OneToOneField 返回对象

  • 一对多:ForeignKey 返回列表

  • 多对多:ManyToManyField

  • 复合模型

    content_type = models.ForeignKey(ContentType, on_delete=models.SET(None))
        object_id = models.IntegerField("关联模型")
        content_object = GenericForeignKey('content_type','object_id')
    
    # 出现在多个被关联的对象
    images = GenericRelation(ImageRelated, verbose_name='关联图片', related_query_name='rel_sight_images')
    
3.CRUD
  • # 单个新增
    User.objects.create(...)
    # 多个新增
    u1 = User(...)
    u2 = User(...)
    User.objects.bulk_create([u1,u2])
    # 保存
    User(...).save()
    
  • R

    User.objects.get(...)
    User.objects.get_object_or_404(...)
    User.objects.get_or_create(...)
    latest/earliest/first/last/all
    
4.QuerySet结果集
  • count() exists() all() none() filter() exclude() order_by()
    
  • 字段名称__查询条件

    id__exact id__lte id__isnull id__icontains
    UserProfile.objects.filter(user__username='管理员')
    
  • filter & Q

    User.objects.filter(name_icontains='',status='')
    
    User.objects.filter(name_icontains='') & User.objects.filter(status='')
    
    query1 = Q(name_icontains='',status='')
    query2 = Q(name_icontains='') & Q(status='')
    User.objects.filter(query2)
    
5.分页处理
 p = Paginator(objects,2) #每页几条
 page = page(3) #第三页
6.聚合统计
 User.objects.all().aggregate(Function()) #返回一个结果
 User.objects.annotate(Function()) #返回多个结果
  • 事务管理

    • 自动提交

      @transaction.atomic() 
      def function():
      	...
      	
      def function():
      	with transaction.atomic()
      		...
      
    • 手动提交

      def function():
      	transaction.set_autocommit(False)
      	try:
      		...
      		a.save()
      		transaction.commit()
      	except:
      		transaction.rollback()
      

表单

1.表单的使用
  1. 创建表单类

    class LoginForm(forms.Form)
    
  2. 添加到表单视图

  3. 渲染到模板

    <form action="." method="post">
    	{{ form.as_p() }}
    	{% csrf_token %}
    </form>
    
  4. 视图中处理表单数据

    def form(request):
    	if request.method="POST":
    		form=LoginForm(request.POST)
    		if form.is_valid():
    			data=form.cleaned_data
    	else:
    		form=LoginForm()
    	return render(request, 'form.html',{
    		'form':form
    	})
    
2.表单验证 clean_xx
  1. 定义clean_xx方法

  2. 获取对应字段验证

  3. 失败返回异常,最后返回data

    def clean_username(self):
    	data = self.cleaned_data['username']
    	if not data:
    		raise forms.ValidationError('')
    	return data
    
3.多个字段验证 clean
def clean(self):
	data = super().clean()
	if self.errors:
		return
	username = data['username']
	...
	return data
4.ORM创建表单
class UserForm(ModelForm):
	class Meta:
		model = User #使用的ORM
		field = [] #ORM哪些需要在表单
		exclude = []
		labels = {
			'username': '手机号码'
		}
		widgets = {
			'password': forms.PasswordInput(attrs={
			})
		}
		error_messages = {
			'username': {
				'max_length': '不够长'
			}
		}
	
	def clean_xxx(self):
		...
5.上传文件
  • HTML实现

    <form action='.' method='post' enctype='multipart/form-data'>
    	{% csrf_token %}
    	<input type='file' name='avatar'>
    	<input type='submit' value='提交'>
    </form>
    
    def xxx(request):
    	if request.method == "POST":
    		file = request.FILES.get('avatar',None)
    		if file:
    			filename=os.path.join(settings.MEDIA_ROOT,'...')
    			with open(filename, 'wb+') as t:
    				for chunk in file.chunks():
    					t.write(chunk)
    
  • Django表单实现

    class AvatarUploadForm(form.Form):
    	avatar = forms.ImageField()
    
    <form action='.' method='post' enctype='multipart/form-data'>
    	{% csrf_token %}
    	{{ form.as_p }}
    	<input type='submit' value='提交'>
    </form>
    
    def xxx(request):
    	if request.method == "POST":
    		form = AvatarUploadForm(data=request.POST,files=request.FILES)
    		if form.is_valid():
                file = form.cleaned_data['avatar']
    			filename=os.path.join(settings.MEDIA_ROOT,'...')
    			with open(filename, 'wb+') as t:
    				for chunk in file.chunks():
    					t.write(chunk)
    
  • ORM上传

    class User(models.model):
    	...
    	avatar = models.ImageField('',upload_to='avatar/%Y%m%d')
    	
    class UserChangeForm(forms.ModelForm):
    	class Meta:
    		model = User
    	
    <form action='.' method='post' enctype='multipart/form-data'>
    	{% csrf_token %}
    	{{ form.as_p }}
    	<input type='submit' value='提交'>
    </form>
    	
    def xxx(request):
    	if request.method == "POST":
    		form = UserChangeForm(data=request.POST,files=request.FILES)
    		if form.is_valid():
                form.save()
    
  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值