簡體   English   中英

Django視圖可以使用默認調用,但是將表單提交到同一視圖僅調用分派,並且頁面為空白

[英]Django view works with default call, but form submission to same view only calls dispatch, and page is blank

我有一個名為ColorList的基於類的視圖(Django 1.7,Python 3.4):

from django.shortcuts          import redirect, render
from django.views.generic      import ListView
from colorlikenatorizer.models import Color

MIN_SEARCH_CHARS = 2
MIN_SEARCH_CHARS_FOR_DISPLAY = "two"

class ColorList(ListView):
    """
        Displays all colors in a table with only two columns: the name
        of the color, and a "like/unlike" button.
    """
    model = Color
    context_object_name = "colors"

    def dispatch(self, request, *args, **kwargs):
        print("cl.1")
        search_text = ""
        if(request.method == "POST"):

            search_text = request.POST.get("search_text", "").strip()
            print("cl.1.2 search_text=" + search_text + "")
            global  MIN_SEARCH_CHARS
            if(len(search_text) < MIN_SEARCH_CHARS):
                print("cl.1.3")

                search_text = ""

        if(search_text != ""):
            self.color_search_results = Color.objects.filter(name__contains=search_text)
        else:
            self.color_search_results = []

        print("cl.2")
        return super(ColorList, self).dispatch(request, *args, **kwargs)

    def get_queryset(self):
        print("cl.3")
        return  super(ColorList, self).get_queryset()

    def get_context_data(self, **kwargs):
        print("cl.4")
        context = super(ColorList, self).get_context_data(**kwargs)

        global  MIN_SEARCH_CHARS_FOR_DISPLAY

        context["color_search_results"] = self.color_search_results
        context["MIN_SEARCH_CHARS_FOR_DISPLAY"] = MIN_SEARCH_CHARS_FOR_DISPLAY
        return  context

當您調用它的主URL時,它可以正常工作: http://my.ip.address/colorliker/

在此處輸入圖片說明

但是,在提交搜索表單時,盡管正確調用了dispatch功能(搜索文本已在print("cl.1.2...上打印到控制台print("cl.1.2...行), get_queryset調用get_querysetget_context_data ,並且網頁完全空白。

有什么想法嗎?


模板:

<!DOCTYPE html>
<html lang="en">
<HTML><HEAD>
    <TITLE>Color Likenatorizer</TITLE>
    <meta name="viewport" content="width=device-width"/>
</HEAD>

<BODY>
<table>
    <TD ALIGN="left" VALIGN="top">
        <form id="search_colors_form_id" method="post" action="{% url 'color_list' %}">
            <input type="text" id="search_text" name="search_text"/>
            {% csrf_token %}
            <input id="id_pic_submit_button" type="submit" value="Search for color"/><BR>
            (Requires {{ MIN_SEARCH_CHARS_FOR_DISPLAY }} or more characters)
        </form>
        {% if color_search_results.count > 0 %}
            <UL>
                {% for  color in color_search_results %} <!-- No colon after "colors" -->
                    <LI>{{ color.name }}</LI>
                {% endfor %}
            </UL>
        {% endif %}

    </TD><TD ALIGN="left" VALIGN="top">
        <H1>Color Likenatorizer</H1>

            {% if  colors.count == 0 %}
                <P><I>There are no colors in the database.</I></P>
            {% else %}
                <TABLE ALIGN="center" BORDER="1" CELLSPACING="0" CELLPADDING="4" BGCOLOR="#EEEEEE"><TR ALIGN="center" VALIGN="middle">
                    <TD><B><U>Title</U></B></TD>
                    <TD>Favorite?</TD>
                {% for  color in colors %} <!-- No colon after "colors" -->
                </TR><TR>
                    <TD VALIGN="top">{{ color.name }}</TD>
                    <TD>
                        <A HREF="{% url 'toggle_color_like' color.id %}">
                            {% if color.is_favorited %}Yes{% else %}No{% endif %}
                        </A></TD>
                {% endfor %}
                </TR></TABLE>
            {% endif %}

    </TD>
</table>
</BODY></HTML>

urls.py:

from django.conf.urls         import patterns, include, url
from django.conf.urls         import patterns
from colorlikenatorizer.views import ColorList

urlpatterns = patterns('',
    url(r"^$", ColorList.as_view(), name="color_list"),
    url(r"^like_color_(?P<color_id>\d+)/$", "colorlikenatorizer.views.toggle_color_like", name="toggle_color_like"),
)

ListView沒有POST處理程序,因此出現405錯誤(不允許使用方法)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM