【问题标题】:How to receive user input from FilteredSelectMultiple widget?如何从 FilteredSelectMultiple 小部件接收用户输入?
【发布时间】:2019-09-09 11:20:07
【问题描述】:

我正在尝试使用 FilteredSelectMultiple 小部件创建表单。我设法让它显示在我的页面上,但在接收用户输入时遇到了困难。现在,在我单击submit 按钮页面后,只需刷新并再次显示相同的表单,而不是转到指定页面。我做错了什么?

到目前为止我的代码:

forms.py

class DrgSkaiciuokle(forms.Form):
    drg_pasirinkimas = forms.ModelMultipleChoiceField(queryset=DRGkodas.objects.all(),
                                                      label="Pasirinkite atvejį sudarančius DRG",
                                                      widget=FilteredSelectMultiple("DRG kodai", is_stacked=False),
                                                      required=True)

    class Media:
        css = {
            'all': ('/static/admin/css/widgets.css',),
        }
        js = ('/admin/jsi18n',)

    #I have no idea if this part is right:
    def clean_drg_pasirinkimas(self):
        drg_pasirinkimas = self.cleaned_data['drg_pasirinkimas']
        return drg_pasirinkimas

views.py

def DRG_skaiciuokle(request):
    if request.method == 'POST':
        form = DrgSkaiciuokle(request.POST)
        pasirinkti_DRG = form.cleaned_data['drg_pasirinkimas']

        context = {
            'pasirinktiDRG': pasirinktiDRG,
            }
        #This page should be opened after submitting form instead of refresh    
        return render(request, 'DRGskaiciuokle_valid.html', context)

    else:
        form = DrgSkaiciuokle()
    context = {
        'form': form,
    }
    return render(request, 'DRGskaiciuokle.html', context) 

我的 html 文件:

{% extends "base_generic.html" %}

{% block content %}
<div id='frame'>
    <div id='sk_head'>
        <h3>Kaštų konvertavimo skaičiuoklė</h3>
        <h4>Pagal DRG metodiką</h4>
    </div>
    <form>
        <div id='sk_body'>
            <fieldset>
            <legend>Įveskite duomenis</legend>      
                <form action="" method="post">
                    {% csrf_token %}
                    <table>
                        {{ form.media }}
                        {{ form.as_table }}
                        <script type="text/javascript" src="{% url 'jsi18n' %}"></script>
                    </table>
                        <input type="submit" value="Skaičiuoti">
                </form>
            </fieldset>
        </div>
    </form>
</div>
{% endblock %}

【问题讨论】:

  • 如果您没有将&lt;form&gt; 标签上的方法设置为“post”,它将使用GET 提交,因此您永远无法到达if request.method == 'POST'。阅读this 了解表单。

标签: python django python-3.x django-forms django-views


【解决方案1】:

您需要按如下方式更新您的代码

  1. 更新 html 文件。

    表格中有表格。您需要按照以下建议删除内部表单并更新外部表单。

{% extends "base_generic.html" %}

{% block content %}
<div id='frame'>
    <div id='sk_head'>
        <h3>Kaštų konvertavimo skaičiuoklė</h3>
        <h4>Pagal DRG metodiką</h4>
    </div>
    <form action="" method="post">  # <-----------------add action and method here
        <div id='sk_body'>
            <fieldset>
            <legend>Įveskite duomenis</legend>      
                <form>
                    {% csrf_token %}
                    <table>
                        {{ form.media }}
                        {{ form.as_table }}
                        <script type="text/javascript" src="{% url 'jsi18n' %}"></script>
                    </table>
                        <input type="submit" value="Skaičiuoti">
                </form>
            </fieldset>
        </div>
    </form>
</div>
{% endblock %}
  1. views.py

    添加form.is_valid()方法调用,检查表单是否有效。

def DRG_skaiciuokle(request):
    if request.method == 'POST':
        form = DrgSkaiciuokle(request.POST)
        if form.is_valid():
            pasirinkti_DRG = form.cleaned_data['drg_pasirinkimas']

            context = {
            'pasirinktiDRG': pasirinktiDRG,
            }
            #This page should be opened after submitting form instead of refresh    
            return redirect('redirect_to_view') # <------------ redirect ot url on success
        context = {
            'form': form,
        }
        return render(request, 'DRGskaiciuokle.html', context)
    else:
        form = DrgSkaiciuokle()
    context = {
        'form': form,
    }
    return render(request, 'DRGskaiciuokle.html', context) 

我认为这会有所帮助。为了澄清DM。

【讨论】:

  • 请注意,在成功 POST 时返回状态为 200 的 HTML 页面是不好的做法,因为这会导致人们在浏览器中重新加载页面时重新提交相同的数据。在这种情况下,您应该始终重定向。
  • 是的!注意到,你是对的。我已经相应地改变了答案。谢谢你的建议。
猜你喜欢
  • 2020-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 2021-09-15
  • 2013-01-20
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多