Django Formsets问题-无法获取要通过.cleaned_data.get()方法返回的表单数据

时间:2019-03-25 11:41:00

标签: django-forms formset django-2.1

我在views.py的formsets变量的.cleaned_data方法中获取数据时遇到问题,我不明白为什么。旁注-我是Webdev和django的100%初学者。...如此,...我的学习曲线非常陡峭。

我能够从我的variable.data ['paramValue']变量中获取数据,但它只是预期的两个索引列表的索引1。

我想要做的事情背后的故事是这个。我正在从数据库中提取数据,并将其显示在网页上。每个数据库条目将具有不同数量的输入参数,因此我需要构建一个动态表单页面,以便能够接受用户为每个条目输入的内容。这些条目将仅存储在数据库中,因此如果它们都是最后一个列表项中的所有成员,就可以了。

我检查了所有Google搜索中出现的每个论坛。我尝试在views.py和forms.py中定义formset_factory(基于各种论坛和文章)。 似乎最适合我的情况的文章是:https://medium.com/@taranjeet/adding-forms-dynamically-to-a-django-formset-375f1090c2b0

我试图在我的forms.py类中定义clean方法,而没有定义它,只是为了看看。我将具有显式定义的clean()方法的版本放在下面...不过,它似乎并没有改变我所看到的行为。

我将尝试仅包含相关的代码...

#forms.py

from django import forms
from django.forms.formsets import formset_factory

class PlayInputParams(forms.Form):
    paramValue = forms.CharField(
        widget=forms.TextInput(attrs={
            'placeholder': 'Enter param values here',
        }),
    )

    def clean(self):
        cleaned_data = super(PlayInputParams, self).clean()
        param_value = cleaned_data.get('paramValue')
        return param_value

InputParamFormset = formset_factory(PlayInputParams)
#views.py

# dynamic_variables is an {} object
dynamic_variables= Endpoint.objects.all().values().get(id__exact=this_play_object.endpoint_id)

param_vals = []

if request.method == 'POST':
    formset = InputParamFormset(request.POST)
    if formset.is_valid():
        for form in formset:
            # Extract param value from each param
            param = form.cleaned_data.get('paramValue')
            if param:
                param_vals.append(param)
            else:
                param_vals.append(None)

context = {
    'formset': formset,
    'module_variables': dynamic_variables,
}

return render(request, 'program/template_file.html', context=context)
#template_file.html

    <form class="form-horizontal" method="POST" action="">
      {% csrf_token %}
      {{ formset.management_form }}
      <!-- selector = .form-row:last, prefix = form -->
      <script type="text/javascript" src="https://code.jquery.com/jquery.min.js">
        function cloneMore(selector, prefix) {
            //var currElement = $(selector).clone(false);
            // The below finds the last element that has class form-row
            console.log('current selector is ' + selector);
            var currElement = $(selector);
            console.log('current element is ' + currElement);
            var total = $('#id_' + prefix + '-TOTAL_FORMS').val();
            console.log('total is ' + total);
            currElement.find(':input').each(function() {
                var name = $(this).attr('name').replace('-' + (total-1) + '-', '-' + total + '-');
                var id = 'id_' + name;
                $(this).attr({'name': name, 'id': id}).val('').removeAttr('checked');
            });
            total++;
            $('#id_' + prefix + '-TOTAL_FORMS').val(total);
            return false;
        }
      </script>
      {% for key, value in module_variables.items %}
        <hr>
        <div class="row form-row spacer">
          <div class="col-2">
            <label>{{ key }}</label>
          </div>
          <div class="col-4">
            <div class="input-group">
              {{ formset.form.paramValue }}
              <div class="input-group-append">
                <!-- onload supported tags are -->
                <!--<body>, <frame>, <frameset>, <iframe>, <img>, <input type="image">, <link>, <script> and <style>-->
                <img src="{% static 'images/pixel.bmp' %}" onload="cloneMore('.form-row:last', 'form')" width="1" height="1" />
              </div>
            </div>
          </div>
        </div>
      {% endfor %}
      <div class="row spacer">
        <div class="col-4 offset-2">
          <button type="submit" class="btn btn-block btn-primary">Save Data Now</button>
        </div>
      </div>
    </form>

由于上述原因,我能够返回数据,并且它在我的views.py文件“ if formset.is_valid”中验证为“有效”,但是

1)我在.cleaned_data中没有数据 2)我可以看到,在测试用例中,我试图在页面上有两个条目,两个条目都在variable.data ['paramValue']中,但是当我尝试解决它时,我只看到了第二个索引列表中。下面是我的调试窗口的输出:

form.data
<QueryDict: {'csrfmiddlewaretoken': ['cGFLJzQ2jm7PUSbfGTWkjuSmL5RF27OU8o2F1cbgbeAWkV59jy1JNIAlGwBueIvk'], 'form-TOTAL_FORMS': ['1'], 'form-INITIAL_FORMS': ['0'], 'form-MIN_NUM_FORMS': ['0'], 'form-MAX_NUM_FORMS': ['1000'], 'paramValue': ['123', '235']}>
# Space #
form.data['paramValue']
'235'

0 个答案:

没有答案