python django listview form 组合使用记录
一、 背景
在使用django的listview类快速建立表格,很方便。便没有理解如何同时使用FORM表单,实现查询功能。
二、官方文档
(一)views
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.views import View
from .forms import MyForm
class MyFormView(View):
form_class = MyForm
initial = {'key': 'value'}
template_name = 'form_template.html'
def get(self, request, *args, **kwargs):
form = self.form_class(initial=self.initial)
return render(request, self.template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
# <process form cleaned data>
return HttpResponseRedirect('/success/')
return render(request, self.template_name, {'form': form})
替代以前的
from django.http import HttpResponseRedirect
from django.shortcuts import render
from .forms import MyForm
def myview(request):
if request.method == "POST":
form = MyForm(request.POST)
if form.is_valid():
# <process form cleaned data>
return HttpResponseRedirect('/success/')
else:
form = MyForm(initial={'key': 'value'})
return render(request, 'form_template.html', {'form': form})
三、难点及解析
(一)要有get和post
不能只有一个,要两个函数都有。
(二)在get和post的函数中,要调用查询,才能出现结果。
(三)引用form时,要使用form_class
views文件
class Listview(ListView):
template_name = 't/listview.html'
form_class = forms.Tform
initial = {
'name':'b'
}
paginate_by = 20
extra_context = {
'title':'T0',
'pagination_url':'t:listview',
'nanme':'a',
}
def get_queryset(self):
return models.T.objects.all()
def get(self,request, *args, **kwargs):
form = self.form_class(initial=self.initial)
object_list=self.get_queryset()
return render(request,self.template_name,{'form':form,'object_list':object_list})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
n_str = form.cleaned_data['name']
object_list = models.T.objects.filter(Q(T01__name__icontains=n_str)|Q(t0__name__icontains=n_str)|Q(name__icontains=n_str))
return render(request, self.template_name, {'form': form,'object_list':object_list})
return render(request, self.template_name, {'form': form})
html文件
<form action="" method="post">
{{form.as_p}}
<input type="submit" value="查询">
</form>
form文件
class Tform(forms.Form):
name = forms.CharField(label='名称')