背景:
demo采用的是前后端不分离的操作,用Bootstrap作为前段页面框架使用
1.先说模板之间的继承(针对HTML来讲)
父模板中编写好公共代码块,例如一个网站的导航和footer部分
在内容部分注明
{%block content%}
{%end block}
ps: 其中conten为名字可以自定义,后面继承时记得保持一致即可
2.Django(url+view+HTML)
编写流程就是url+view+HTML 这个顺序看个人习惯,没有前后之分。
先说下view部分,也就是我们函数业务逻辑处理部分(上代码)===普通选手
查全部
def userlist(request): user_list=publish.objects.all().order_by('-id') return render(request,'userlist.html',{"user_list":user_list})
改数据
def usereditor(request,nid): if request.method=="GET": row_objec=models.publish.objects.filter(id=nid).first() return render(request,'usereditor.html',{"row_objec":row_objec}) name=request.POST.get("name") city=request.POST.get("city") models.publish.objects.filter(id=nid).update(name=name,city=city) return redirect('../userlist/')
删除数据
def userdelete(request): nid=request.GET.get('nid') print(nid) models.publish.objects.filter(id=nid).delete() return redirect('../userlist/')
添加数据
def useradd(request): if request.method=='GET': return render(request,'useradd.html') name=request.POST.get("name") city=request.POST.get("city") models.publish.objects.create(name=name,city=city) return redirect('../userlist/')
进阶选手=借用form 和modleform(君子性非异也,善假于物也。)
借用form
# 通过form实现 class pulishform(Form): name=forms.CharField(widget=forms.TextInput) city=forms.CharField(widget=forms.TextInput) def useraddform(request): if request.method=="GET": form=pulishform() return render(request,'useraddform.html',{"form":form})
ps:return回去的数据最好写form 这里踩过坑 后面对数据处理总是有问题,还需要观察一下。
借用modelform
class pulishform1(forms.ModelForm): class Meta: model=models.publish # fields=['name','city'] fields="__all__" widgets={ 'name':forms.TextInput(attrs={'class':'form-control'}), 'city':forms.TextInput(attrs={'class':'form-control'}), } # 这个还需要验证 我的是不能这样操作的 def __init__(self,*args,**kwargs): super().__init__(*args,**kwargs) for name, field in self.fields.__getitem__(i=0): field.widget.attrs={"class":"form-control","placeholder":field.label}
#添加数据
def useraddmodleform(request): if request.method=="GET": form = pulishform1() return render(request, 'useraddmodleform.html', {"form": form}) form=pulishform1(data=request.POST) if form.is_valid(): form.save() return redirect('../userlist/') return render(request,'useraddmodleform.html',{"form":form}) #编辑 def usereditormodleform(request,nid): if request.method=="GET": row_object=models.publish.objects.filter(id=nid).first() form=pulishform1(instance=row_object) return render(request,'usereditormodleform.html',{"form":form}) row_object=models.publish.objects.filter(id=nid).first() form=pulishform1(data=request.POST,instance=row_object) if form.is_valid(): form.save() return redirect('../../userlist/') return render(request,'usereditormodleform.html',{"form":form})
整体备注一下:如果django项目安装了debug_tools记得关掉 Intercept redirects,否则在redirect时会出现302页面
其次就是里面的路径:因为我是使用了二级路由,所以在项目的路由上不方便调试。如果使用的二级路由在redirect时可以考虑用相对路径即../../userlist/ 或者../userlist/根据自己项目和路由配置灵活调整。
在前端的路由需要熟悉模板语法
<td><a href="{% url 'userdelete'%}?nid={{ items.id }}" style="text-decoration: none">删除</a>
这里面的这部分{% url 'userdelete'%} 就直接匹配到位了
其次就是继承模板
{% extends "user_index.html" %}
编写模板中需要我们填充的部分
{% block content %}
#前端代码实现块
{%end block%}
还需要特别说明的就是bootstrap的使用,版本之间组件还有不同,用的时候需要特别关注、
其中在django中二级url中的配置如下:
# 普通的增删改查 path('userlist/',views.userlist), path('useradd/',views.useradd,name='useradd'), path('userdelete/',views.userdelete,name="userdelete"), path('<int:nid>/update/',views.usereditor,name='usereditor'), # modleform 和from path('useraddform/', views.useraddform, name='useraddform'), path('useraddmodleform/', views.useraddmodleform, name='useraddmodleform'), path('<int:nid>/modelupdate/', views.usereditormodleform, name='useraddmodleform'),