Проблема с Django Formsets - Не удается получить данные формы для возврата в методе .cleaned_data.get () - PullRequest
0 голосов
/ 25 марта 2019

У меня проблемы с получением данных для возврата в методе .cleaned_data моей переменной formsets в файле views.py, и я не понимаю, почему. Примечание: я на 100% новичок в webdev и django .... ооочень .... моя кривая обучения довольно крутая.

Я могу получить данные обратно в моей переменной variable.data ['paramValue'], но это только индекс 1 из списка ожидаемых двух индексов.

История, которую я пытаюсь сделать, заключается в следующем. Я извлекаю данные из своей базы данных и отображаю их на своей веб-странице. Каждая запись в базе данных будет иметь различное количество входных параметров, поэтому мне нужно создать страницу динамических форм, чтобы можно было принимать ввод от пользователя для каждой из этих записей. Эти записи будут просто сохранены в базе данных, поэтому хорошо, если они все будут членами одного списка в конце.

Я проверил все форумы, которые встречаются во всех моих поисках в Google. Я попытался определить formset_factory в views.py и forms.py (на основе различных форумов и статей). Статья, которая кажется наиболее подходящей моему сценарию, такова: https://medium.com/@taranjeet/adding-forms-dynamically-to-a-django-formset-375f1090c2b0

Я пытался определить метод clean в своем классе forms.py, а НЕ определять его, просто чтобы посмотреть. Ниже я приведу версию с явно определенным методом 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'
...