簡體   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