Django : modelformset not reflecting initial data
我正试图创建一个表单来编辑用户的技能,他们保存了多个技能。呈现后,模板输入字段为空,但根据queryset创建的表单数是正确的。
表格.py1 2 3 4 5 6 7 | class skillform(forms.ModelForm): name = forms.CharField(label='Skill',widget=forms.TextInput(attrs={'class': 'form-control',})) level = forms.ChoiceField(choices=(('Novice','Novice'),('Beginner','Beginner'),('Skillful','Skillful'),('Experienced','Experienced'),('Expert','Expert')),label="level",initial='Skillful',widget=forms.Select(),required=False) class Meta: model = userskills_model fields = ('name','level') skillformset = modelformset_factory(userskills_model, form = skillform, extra=0, can_delete=False) |
型号.py
1 2 3 4 5 6 | class userskills_model(models.Model): userid = models.ForeignKey(user_model, on_delete=models.PROTECT) skills =models.CharField(max_length=264,unique=False,blank=False,null=False) skills_level = models.CharField(max_length=264,unique=False,blank=False,null=False) def __str__(self): return str(self.userid) |
号视图.py
1 2 3 4 5 6 7 8 9 10 11 | def skillview(request): qset=userskills_model.objects.filter( userid=user_model.objects.get(userid=userid)) skillformset(queryset = qset) if request.method == 'GET': formset = skillformset(request.GET or None) elif request.method == 'POST': formset = skillformset(request.POST) #validating and saving return render(request, template_name, { 'formset': formset, }) |
模板/skills.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | {% extends 'app/base.html' %} {% load staticfiles%} {% block head %} <link href="{% static"/css/skills.css" %}" rel="stylesheet" type="text/css"/> {% endblock %} {% block content %} SKILLS <form class="form-horizontal" method="POST" action=""> {% csrf_token %} {{ formset.management_form }} {% for form in formset %} <label>{{form.name.label}}</label> {{form.name}} <label>{{form.level.label}}</label> {{form.level}} <!-- <button class="btn btn-success add-form-row">+</button> --> <button class="btn btn-success add-form-row">+</button> {% endfor %} <button type="submit" class="btn3">Save and Continue</button> </form> {% endblock %} {% block custom_js %} <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"> <script type="text/javascript"> function updateElementIndex(el, prefix, ndx) { var id_regex = new RegExp('(' + prefix + '-\\d+)'); var replacement = prefix + '-' + ndx; if ($(el).attr("for")) $(el).attr("for", $(el).attr("for").replace(id_regex, replacement)); if (el.id) el.id = el.id.replace(id_regex, replacement); if (el.name) el.name = el.name.replace(id_regex, replacement);} function cloneMore(selector, prefix) { var newElement = $(selector).clone(true); var total = $('#id_' + prefix + '-TOTAL_FORMS').val(); newElement.find(':input').each(function() { var name = $(this).attr('name') if(name) { name = 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); $(selector).after(newElement); var conditionRow = $('.form-row:not(:last)'); conditionRow.find('.btn.add-form-row') .removeClass('btn-success').addClass('btn-danger') .removeClass('add-form-row').addClass('remove-form-row') .html('-'); return false;} function deleteForm(prefix, btn) { var total = parseInt($('#id_' + prefix + '-TOTAL_FORMS').val()); if (total > 1){ btn.closest('.form-row').remove(); var forms = $('.form-row'); $('#id_' + prefix + '-TOTAL_FORMS').val(forms.length); for (var i=0, formCount=forms.length; i<formCount; i++) { $(forms.get(i)).find(':input').each(function() { updateElementIndex(this, prefix, i); }); } } return false;} $(document).on('click', '.add-form-row', function(e){ e.preventDefault(); cloneMore('.form-row:last', 'form'); return false;}); $(document).on('click', '.remove-form-row', function(e){ e.preventDefault(); deleteForm('form', $(this)); return false;}); {% endblock %} |
。
编辑:添加了模板/skills.html。我被这个卡住了,请帮帮我。
我想你的qset是空的,试试这个-qset=userskills_model.objects.filter(userid=self.request.user)此为登录用户
用于更新案例-user=get_object_或_404(user_model,userid=userid)qset=userskills_model.objects.filter(userid=user)
您在
1 2 3 4 5 6 | class skillform(forms.ModelForm): skills = forms.CharField(label='Skill',widget=forms.TextInput(attrs={'class': 'form-control',})) skills_level = forms.ChoiceField(choices=(('Novice','Novice'),('Beginner','Beginner'),('Skillful','Skillful'),('Experienced','Experienced'),('Expert','Expert')),label="level",initial='Skillful',widget=forms.Select(),required=False) class Meta: model = userskills_model fields = ('skills','skills_level') |
并将模板更新为引用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ... {% for form in formset %} <label>{{form.skills.label}}</label> {{form.skills}} <label>{{form.skills_level.label}}</label> {{form.skills_level}} ... |
号