[英]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_queryset
和get_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.