我在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'