是否可以在无模型的数据库模型上使用`modelformset_factory`?

时间:2020-01-24 13:24:44

标签: django django-forms

我有一个名为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

Class CodeMapFinal(ModelForm): def init (自身,* args,** kwargs): super()。初始化(* 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(),提交的表单也总是保存一个空条目。

0 个答案:

没有答案