2014-01-30 43 views
0

我真的可以在这里使用一些帮助,因为我无法弄清楚如何按照我想要的方式获得这个逻辑。在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> 

希望这不是太混乱。任何帮助或指针在正确的方向将不胜感激!

回答

0

我完全可以与你的情况完全相关。

所以基本上你不必有2个不同的功能(在views.py中)。 有一个功能来渲染和显示页面。像这样的东西

if request.post and form.is_valid(): 
    ''' 
     search logic for the query 
    ''' 
    info = Fruitinfo...... (bannana) 
    return render(request, "find.html", {'form': form}) 
    elif form.errors : 
    return render(request, "find.html", {'form': form}) 
    else: 
    form = SearchForm() 
    return render(request, "find.html", {'form': form}) 

这是我通常如何处理表格,它一直工作正常。我知道重复行可以避免,但为了更好地理解,我已经把它留下了。