【问题标题】:Processing GET request in Django form logic在 Django 表单逻辑中处理 GET 请求
【发布时间】:2014-02-22 02:20:16
【问题描述】:

我真的可以在这里使用一些帮助,因为我不知道如何以我想要的方式获得这个逻辑。

我也有一个基本的 Django 应用程序和 Django CMS。

localhost/find 上,我有一个显示下拉菜单和提交按钮的 Django 表单小部件。如果在下拉菜单中未选择任何内容并单击按钮,我希望 URL 保持在 localhost/find 并显示错误消息。如果满足下拉菜单条件,我想显示一个 URL 为 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>

希望这不会太令人困惑。任何正确方向的帮助或指示将不胜感激!

【问题讨论】:

    标签: django forms django-forms django-cms


    【解决方案1】:

    我完全可以理解你同样的情况。

    所以基本上你不必有 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})
    

    这就是我通常处理表单的方式,并且运行良好。我知道可以避免重复的线条,但为了更好地理解,我就这样保留了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多