我真的可以在这里使用一些帮助,因为我无法弄清楚如何按照我想要的方式获得这个逻辑。在Django窗体逻辑中处理GET请求
我有一个基本的Django应用程序和Django CMS。
在localhost/find
,我有一个Django窗体小部件,它显示一个下拉菜单和一个提交按钮。如果在下拉菜单中没有选择任何内容,并且点击了该按钮,我希望URL保持在localhost/find
并显示错误消息。如果满足下拉菜单条件,我想显示一个网页,网址为localhost/fruit_info?selection=banana
,其内容取决于用户选择的内容。因此,例如,如果用户选择“香蕉”,我会显示一个关于香蕉的信息页面(我知道这是一个愚蠢的例子,但我希望你明白了)。
现在,这里是发生了什么:
的localhost/find
页面加载和显示形式。在没有从下拉菜单中选择任何内容的情况下,我点击该按钮,然后将我带至localhost/fruit_info?
,再次显示确切的表单。相反,我希望它保持在localhost/find
并显示错误消息。
接下来,如果我选择了一些内容并单击该按钮,它会带我到localhost/fruit_info?selection=banana
(这很好,这意味着正在发送GET请求),但不是显示适当的香蕉信息页面,而是再次显示该表单。
因此,除了显示错误的问题之外,另一个大问题是如何创建确定显示哪个水果页面的逻辑。我是否在CMS管理员中为每个人创建一个?
这是一些相关的代码。
forms.py
from django import forms
class SearchForm(forms.Form):
fruit = forms.ChoiceField(choices=..., required=True)
views.py
def find(request):
form = SearchForm() # an unbound form
return render(request, "find.html", {'form': form})
def fruit_info(request):
form = SearchForm(request.GET) # a form bound to the GET data
if form.is_valid(): # the dropdown menu has an item selected
fruit_name = form.cleaned_data['fruit']
# it's this logic here that I'm unsure about. Do I return a separate page per fruit?
if fruit_name == "banana":
return render(request, "banana.html", {})
if fruit_name == "kiwi":
return render(request, "kiwi.html", {})
...
else: # if nothing selected
form = SearchForm() # an unbound form
return render(request, "find.html", {'form': form})
urls.py
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^find/', find),
url(r'^fruit_info/', fruit_info),
url(r'^', include('cms.urls')),
)
if settings.DEBUG:
urlpatterns = patterns('',
url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
url(r'', include('django.contrib.staticfiles.urls')),
) + urlpatterns
find.html
{% if form.errors %}
<div class="err">{{ form.errors }}</div>
{% endif %}
<form action="{% url "mysite.views.fruit_info" %}" method="GET"> #not sure if the action attribute is correct here
{{ form.fruit }}
<button>Find</button>
</form>
希望这不是太混乱。任何帮助或指针在正确的方向将不胜感激!