简体   繁体   English

Django modelformset_factory不保存到数据库

[英]Django modelformset_factory does not save to database

The issue is that Django modelformset_factory does not save to database when inputs are inserted into the forms. 问题是当将输入插入表单时,Django的Django modelformset_factory不会保存到数据库。 It appears that only else statement is reached after forms are submitted for processing. 似乎在提交表单进行处理后仅到达了else语句。 Clearly the issue is with part in views.py where if 'name' in request.POST: then do sth. 显然,问题出在views.py中,如果在request.POST中使用“ name”,则执行某项操作。 Advise how to solve it would be highly appreciated. 建议如何解决它将不胜感激。 Thank you. 谢谢。

views.py views.py

from django.shortcuts import render
from .forms import modelformset_factory, AssumptionsForm
from .models import Assumptions

model_names = ['Form1', 'Form2']


def get_assumptions(request):

    if request.method == 'POST' and 'name' in request.POST:

        formset = modelformset_factory(
            Assumptions, form=AssumptionsForm, extra=5)

        if formset.is_valid():

            print('valid form')

            for form in formset:

                if form.is_valid():

                    print('in for loop after valid form1')

                    assumptions = form.save(commit='False')
                    assumptions.Name = 'name'
                    assumptions.save()

    else:

        formset = modelformset_factory(
            Assumptions, form=AssumptionsForm, extra=5)

        print('reached else')

    return render(request, 'assumptions.html', {'formset': formset, 'model_names': model_names})

models.py models.py

from django.db import models
from django.forms import ModelForm

class Assumptions(models.Model):

    Worst_Case = models.FloatField(null=True, blank=True, default=None)
    Grey_Case = models.FloatField(null=True, blank=True, default=None)
    Red_Case = models.FloatField(null=True, blank=True, default=None)
    Blue_Case = models.FloatField(null=True, blank=True, default=None)
    Green_Case = models.FloatField(null=True, blank=True, default=None)
    Best_Case = models.FloatField(null=True, blank=True, default=None)
    Name = models.TextField(null=True, blank=True, default=None)

forms.py 表格

from django import forms
from django.forms import modelformset_factory, ModelForm
from .models import Assumptions

class AssumptionsForm(ModelForm):

    class Meta:
        model = Assumptions
        fields = ['Worst_Case', 'Grey_Case', 'Red_Case', 'Blue_Case', 'Green_Case', 'Best_Case']
        exclude = ['Name']

assumptions.html 假定.html

<div class="form">
<form action="" method="post">
{% csrf_token %}
{{ formset.management_form }}
{{ formset.non_form_errors.as_ul }}
{% for name in model_names %}
<h1>{{name}}</h1>
<table id="formset" class="form">
{% for form in formset.forms %}
  {% if forloop.first %}
  <thead><tr>
    {% for field in form.visible_fields %}
    <th>{{ field.label|capfirst }}</th>
    {% endfor %}
  </tr></thead>
  {% endif %}
  <tr class="{% cycle 'row1' 'row2' %}">
  {% for field in form.visible_fields %}
    <td>
    {# Include the hidden fields in the form #}
    {% if forloop.first %}
      {% for hidden in form.hidden_fields %}
      {{ hidden }}
      {% endfor %}
    {% endif %}
      {{ field.errors.as_ul }}
      {{ field }}
    </td>
  {% endfor %}
  </tr>
{% endfor %}
</table>
<input type="submit" name="{{name}}" value="save" />
{% endfor %}


</form>
</div>

name需要在您的request.POST中。POST,请仔细检查您的模板并添加一个带有name='name'input标签

<input name='name' />

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM