[英]django form submit not working
我创建了for接口,供用户按值过滤数据库中的内容。
课堂上的观点
class FilterCommentsUIView(TemplateView,FormView):
template_name = 'allcomments.html'
form_class = CommentFilterForm
def get_context_data(self, **kwargs):
context = super(FilterCommentsUIView, self).get_context_data(**kwargs)
logger.debug("Entered context data")
logger.debug(self.request.method)
if self.request.method == 'POST':
form = CommentFilterForm(self.request.POST)
loggeer.debug("Entered POST")
if form.is_valid():
logger.debug("Entered is valid")
parenttype = self.request.POST['pchoice']
users = self.request.POST.get('users')
tags = self.request.POST.get('tags')
fdate = self.request.POST.get('fdate')
tdate = self.request.POST.get('tdate')
typeuser = self.request.POST.get('typeuser')
query = self.request.POST.get('query')
userid = User.objects.get(username ='pavan')
comments = Item.objects.all().filter(user = userid.id).order_by('-created')
paginator = Paginator(comments,20)
page = self.request.GET.get('page')
try:
comments = paginator.page(page)
except PageNotAnInteger:
comments = paginator.page(1)
except EmptyPage:
comments = paginator.page(paginator.num_pages)
context['comments']=comments
context['form']=CommentFilterForm
else:
logger.debug("Entered isvalid else")
logger.debug(form.errors)
else:
logger.debug("Entered Else of POST")
form = CommentFilterForm()
comments = Item.objects.all().order_by('-created')
paginator = Paginator(comments, 20)
page = self.request.GET.get('page')
try:
comments = paginator.page(page)
except PageNotAnInteger:
comemnts = paginator.page(1)
except EmptyPage:
comments = paginator.page(paginator.num_pages)
context['comments']=comments
context['form']= form
return context
当我单击提交按钮时,它不会进入POST if部分。 它总是去其他部分。 我究竟做错了什么 ?
在此先感谢您的帮助。 帕文
正如其他人所说的那样,您对所有代码都在get_context_data
的事实有get_context_data
。 实际上,您甚至不需要使用get_context_data
即可完成您想做的事情。
据我所知,您正在尝试在页面上发表评论。 然后将表单提交回页面,并获得过滤掉的一组注释,并进行渲染。 这是一个视图解决方案,除了可以更充分地使用基于泛型类的视图之外,它可以更好地满足您的需求。
class FilterCommentsUIView(FormMixin, ListView):
template_name = 'allcomments.html'
form_class = CommentFilterForm
paginate_by = 20
model = Item
context_object_name = 'comments'
qs_kwargs = {}
def post(self, request, *args, **kwargs):
"""
Handles POST requests, instantiating a form instance with the passed
POST variables and then checked for validity.
"""
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
def get_queryset(self):
qs = super(FilterCommentsUIView, self).get_queryset()
if self.qs_kwargs:
return qs.filter(**self.qs_kwargs)
return qs
def form_valid(self, form):
parenttype = form.cleaned_data['pchoice']
users = form.cleaned_data('users')
tags = form.cleaned_data('tags')
fdate = form.cleaned_data('fdate')
tdate = form.cleaned_data('tdate')
typeuser = form.cleaned_data('typeuser')
query = form.cleaned_data('query')
userid = User.objects.get(username ='pavan')
# put logic here on what to expand into a filter on orm
self.qs_kwargs['user'] = userid.id
self.render_to_response(self.get_context_data())
我没有运行此代码,但这就是它的工作方式。
它使用FormMixin
为我们提供表单功能以及带有Item
类的ListView
。 这需要查询对象并对其进行分页,以及基本的get
方法。
另外, ListView
继承自TemplateResponseMixin
,后者具有您的模板代码,因此您无需继承TemplateView
因此在上面的代码中,我删除了它。
基于ListView
使用派发方法的基本View
类的本质,它会检测您是否正在执行GET
, POST
, PUT
, DELETE
等。因此,它将在视图上调用适当的方法。 在这种情况下,由于您正在执行POST
,它将在视图中调用post方法。 post
的FormView
的实现是这样的:
def post(self, request, *args, **kwargs):
"""
Handles POST requests, instantiating a form instance with the passed
POST variables and then checked for validity.
"""
form_class = self.get_form_class()
form = self.get_form(form_class)
if form.is_valid():
return self.form_valid(form)
else:
return self.form_invalid(form)
由于我们没有使用FormView
,而是使用FormMixin
我们需要包括它。
因此,它所做的就是获取在self.form_class
设置的表单类以实例化它,然后检查它是否有效。 如果是这样,则调用form_valid
方法。 因此,我们覆盖了上面的form_valid
方法。 由于它通过了它的表单,并且已经清除了所有数据,因此我们可以使用常规的Django形式form.cleaned_data
。 这有助于我们提高安全性,因此我们应该使用它来获取信息。
在form_valid
方法的最后一部分中,我们返回render_to_response
。 通常,这只是重定向到self.success_url
,但是我们要呈现页面,因此我们只需要执行一次render_to_response并将其传递到上下文数据中即可。 我们将之称为self.get_context_data()
因为这是构建所有数据以分页所需注释的原因。
现在有点magic
。 如果您注意到有self.qs_kwargs
。 这在GCBV中通常不存在,但是我为此实现添加了一些东西。 在这里,您将放置逻辑以构建过滤器字典,以在get_queryset
的orm调用中get_queryset
。 我们将其打包到字典中,因为在上面的get_queryset
方法中,如果需要,我们将其全部解压缩以进行过滤。
因此,如果您有:
qs_kwargs = {'user': user.id, 'created__gt': somedate}
你也是:
qs.filter(**qs_kwargs)
或Item.objects.filter(**qs_kwargs)
大致与执行以下操作相同:
qs.filter(user=user.id, created__gt=somedate)
或Item.objects.filter(user=user.id, created__gt=somedate)
最后,如果你注意get_queryset
方法,你注意到它返回所有的结果,就像你想要的,除非qs_kwargs
填充从发生form_valid
方法。 因此,它需要考虑页面上的GET
和POST
。
为了使事情简单,您的html应该看起来像这样:
<html>
<head></head>
<body>
<div>
{% for comment in comments %}
{{ comment }}
{% endfor %}
<ul class="pagination">
{% if page_obj.has_previous() %}
<li><a href="?page={{ page_obj.previous_page_number }}">Previous</a></li>
{% endif %}
{% for pg in paginator.page_range %}
{% if page_obj.number == pg %}
<li class="active"><a href="?page={{ pg }}">{{ pg }}</a></li>
{% else %}
<li><a href="?page={{ pg }}">{{ pg }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next() %}
<li><a href="?page={{ page_obj.next_page_number() }}">Next</a></li>
{% endif %}
</ul>
</div>
<div>
<form action="" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="submit" />
</form>
</div>
</body>
</html>
希望能有所帮助。
这需要在form_valid()方法中完成,而不是在get_context_data方法中完成。 get_context_data仅用于在请求期间向模板提供额外的数据(即上下文)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.