如何从FilteredSelectMultiple小部件接收用户输入?

时间:2019-09-09 11:20:07

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

我正在尝试使用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 %}

1 个答案:

答案 0 :(得分:2)

您需要按照以下步骤更新代码

  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。