Можно ли использовать `modelformset_factory` в неизмененной модели базы данных? - PullRequest
0 голосов
/ 24 января 2020

У меня есть неуправляемая модель под названием Codemap

class Codemap(models.Model):
    code_map_id = models.AutoField(primary_key=True)
    field = models.CharField(max_length=255, null=True, blank=True)

    class Meta:
        managed = False

Я просто хочу знать, возможно ли здесь использовать modelformset_factory, потому что при использовании has_changed() поднимается AttributeError

forms.py

класс CodeMapFinal (ModelForm): def init (self, * args, ** kwargs): super (). init (* args, ** kwargs) self.queryset = Codemap.objects.all ()

class Meta:
    model = Codemap
    fields = '__all__'

views.py

class CodeMapView(View):
    template_name = 'tabledata/code-map.html'

    def get(self, request):
        codemap = Codemap.objects.all()
        codemap_formset = modelformset_factory(Codemap, form=CodeMapFinal, can_delete=True, exclude=['code_map_id', 'display_label', 'type'], extra=0)
        return render(request, self.template_name, context={'rows': codemap, 'formset': codemap_formset})

def post(self, request):
    formset = CodeMapFinal(request.POST)

    if formset.is_valid():
        instances = formset.save(commit=False)
    return HttpResponse("asdfasdfasdf")

template. html

<div class="row">
    <div style='background-color: #f2f2f2;' class="col-2">
        <strong>Type</strong>
        <ul>
            {% for row in rows %}
            <li><a href="#" onclick="show_type_specific({{row.code_map_id}})">{{row.type}}</a></li>
            {% endfor %}
        </ul>
        <strong>Display Label</strong>
        <ul>
            {% for row in rows %}
            <li><a href="#" onclick="show_display_specific({{row.code_map_id}})">{{row.display_label}}</a></li>
            {% endfor %}
        </ul>
    </div>
    <div class="w-100 col-4">
        <table class="table table-bordered">
            <tr>
                <th>Index</th>
                <th>Type</th>
                <th>Input Value</th>
                <th>Output Value</th>
                <th>Display Label</th>
            </tr>
            <tbody class='table-body'>
                {% for row in rows %}
                <tr>
                    <td>{{forloop.counter}}</td>
                    <td>{{row.type}}</td>
                    <td>{{row.input_value}}</td>
                    <td>{{row.output_value}}</td>
                    <td>{{row.display_label}}</td>
                </tr>
                {% endfor %}
            </tbody>
        </table>
    </div>
</div>
<div id="form-div" hidden="hidden">
<h3>Code Map</h3>
<form action="" method="post">
    {% csrf_token %}
    {{ formset.management_form }}
    <div id="form_set">
        {% for form in formset %}
            {{form.non_field_errors}}
            {{form.errors}}
            <table class='no_error'>
                {{ form }}
            </table>
        {% endfor %}
    </div>
    <input type="button" class="btn btn-primary" value="Add More" id="add_more">
    <button type="submit" class="btn btn-success">Save</button>
    <div id="empty_form" style="display:none">
        <table class='no_error'>
            {{ formset.empty_form }}
        </table>
    </div>
</form>
</div>
{% endblock %}

{% block extrajs %}
<script type="text/javascript">
$('#add_more').click(function() {
    var form_idx = $('#id_form-TOTAL_FORMS').val();
    $('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
    $('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});
</script>

<script type="text/javascript">
    function show_type_specific(id){
        $(".table").find(`tr:eq(${id})`).remove();
        $("#form-div").attr("hidden", false);
    }

function show_display_specific(id){
    $(".table").find(`tr:eq(${id})`).remove();
    $("#form-div").attr("hidden", false);
}
</script>
{% endblock %}

Даже если я не использую has_changed(), отправленная форма всегда сохраняет пустую запись.

...