简体   繁体   中英

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. It appears that only else statement is reached after forms are submitted for processing. Clearly the issue is with part in views.py where if 'name' in request.POST: then do sth. Advise how to solve it would be highly appreciated. Thank you.

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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