繁体   English   中英

django表格提交不起作用

[英]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类的本质,它会检测您是否正在执行GETPOSTPUTDELETE等。因此,它将在视图上调用适当的方法。 在这种情况下,由于您正在执行POST ,它将在视图中调用post方法。 postFormView的实现是这样的:

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方法。 因此,它需要考虑页面上的GETPOST

为了使事情简单,您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM