Django: модельформсет, не отражающий исходные данные - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь создать форму для редактирования навыков пользователя, где они сохранили несколько нет. навыков. после рендеринга шаблона поля ввода пустые но нет. формы созданы правильно в соответствии с набором запросов.

forms.py

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)

models.py

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)

views.py

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

{% extends 'app/base.html' %}
{% load staticfiles%}
{% block head %}
<link href="{% static "/css/skills.css" %}" rel="stylesheet" 
type="text/css"/>
{% endblock %}
{% block content %}
<div class="heading_text">SKILLS</div>
<form class="form-horizontal" method="POST" action="">
    {% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
<div class="row form-row spacer">
    <div class="col-5">
        <label>{{form.name.label}}</label>
        <div class="input-group">
            {{form.name}}
            </div>


    </div>
    <div class="col-5">
        <label>{{form.level.label}}</label>
        <div class="input-group">
            {{form.level}}
            <!-- <div class="input-group-append">
                <button class="btn btn-success add-form-row">+</button>
            </div> -->
        </div>
    </div>
    <div class="input-group-append">
        <button class="btn btn-success add-form-row">+</button>
    </div>
</div>

{% endfor %}
<div class="row spacer">
    <div class="col-3 button1">
        <button type="submit" class="btn3">Save and Continue</button>
    </div>
</div>
</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>
  <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;});
</script>
{% endblock %}

edit: добавлен шаблон / skill.html. Я застрял с этим, пожалуйста, помогите мне здесь

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Полагаю, ваш qset пуст, попробуйте это - qset = userskills_model.objects.filter (userid = self.request.user) # Это для зарегистрированного пользователя

Для случая обновления - user = get_object_or_404 (user_model, userid = userid) qset = userskills_model.objects.filter (userid = user)

0 голосов
/ 02 января 2019

Поля, которые вы объявили в skillform, не существуют в userskills_model, поэтому они не будут заполнены чем-либо. Попробуйте переименовать поля в вашей форме в skills и skills_model, чтобы они соответствовали вашей модели:

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')

и обновите свой шаблон до ссылки form.skills и form.skills_level:

...
{% for form in formset %}
<div class="row form-row spacer">
    <div class="col-5">
        <label>{{form.skills.label}}</label>
        <div class="input-group">
            {{form.skills}}
            </div>


    </div>
    <div class="col-5">
        <label>{{form.skills_level.label}}</label>
        <div class="input-group">
            {{form.skills_level}}
            ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...