Python 从Django模型表单集中保存数据

Python 从Django模型表单集中保存数据,python,django,python-3.x,formset,Python,Django,Python 3.x,Formset,如何将django模型表单集中的数据保存到数据库 models.py: from django.db import models from django.utils import timezone class MyModel(models.Model): idno = models.CharField(max_length=20) date = models.DateTimeField(default=timezone.now) entity = models.Char

如何将django模型表单集中的数据保存到数据库

models.py:

from django.db import models
from django.utils import timezone

class MyModel(models.Model):
    idno = models.CharField(max_length=20)
    date = models.DateTimeField(default=timezone.now)
    entity = models.CharField(max_length=50)
    logic = models.CharField(max_length=100)
    choices = (
        ('1', 'Choice1'),
        ('2', 'Choice2'),
        ('3','Choice3'),
    )
    choices = models.CharField(
        max_length=20,
        choices=choices,
        null=True,
        )
    comment = models.CharField(max_length=500, null=True)
    def __str__(self):
        return self.idno
forms.py:

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

class MyForm(ModelForm):

    class Meta:
        model = MyModel
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['idno'].disabled = True
        self.fields['date'].disabled = True
        self.fields['entity'].disabled = True
        self.fields['logic'].disabled = True

MyFormSet = modelformset_factory(MyModel, extra=1, exclude=(), form=MyForm)
views.py:

from django.shortcuts import render
from django.http import HttpResponse
from .models import MyModel
from .forms import MyFormSet

def index(request):
new = MyModel.objects.filter(choices__isnull=True)
modelformset = MyFormSet(request.POST or None, queryset=new)
context = {'modelformset':modelformset}
if request.method == 'POST':
    if modelformset.is_valid():
        modelformset.save()
        idno = modelformset.cleaned_data['idno']
        entity = modelformset.cleaned_data['entity']
        messages.success(request, '%s for %s submitted' % (idno, entity))
    return HttpResponseRedirect('/')
return render(request, 'selfserve/index.html', context)
index.html:

<form method="post" action="">
  {% csrf_token %}
  {{ modelformset.management_form }}
<table>
<tr>
  <th>idno</th>
  <th>date</th>
  <th>entity</th>
  <th>logic</th>
  <th>choices</th>
  <th>comment</th>
</tr>
{% for form in modelformset %}
<tr>
  <td>{{ form.idno }}</td>
  <td>{{ form.date }}</td>
  <td>{{ form.entity }}</td>
  <td>{{ form.logic }}</td>
  <td>{{ form.choices }}</td>
  <td>{{ form.comment }}</td>
  <td><input type="submit" value="Submit"></td>
</tr>
{% endfor %}
</table>
</form>
我知道这通常意味着模板中没有包含管理表单。然而,我已经包括了这一部分


我认为我的问题是views.py和index.html的组合,我只是不确定在哪里。理想情况下,我希望保存数据,并且用户保持在同一页面上,这样他们就不必在保存每个数据时来回移动。或者,可能只需要一个保存按钮,他们在完成所有编辑后单击该按钮即可。

您不希望每行都有一个提交按钮。一次提交所有行。。您只需提交表单集所在的表单。谢谢-我想可能是这样的。好的,把按钮放在桌子外面。实际提交数据需要进行哪些更改?如何使提交数据的行消失?现在我只在选项为空的情况下提取数据。那么,有没有一种方法可以在同一页面上呈现,从而再次执行该筛选器?如果是post,则会传递post数据。。如果是GET,则不会传递任何消息,这是您想要的行为。Django一开始让人困惑的一点是,表单/表单集总是需要他们正在处理的对象/查询集,无论是get还是post。yea
modelformset=MyFormSet(request.post或None,queryset=modelObjects)
然后使用该modelformset,无论它是get还是post。。。另外,你可以简化你的逻辑。。您总是要在最后进行渲染,因此只需将其从if/else块中去掉即可,只需..'如果request.method==POST。。然后,如果表单集有效,则保存。不要在那里渲染。如果不是一个职位。。没有别的。。只需在底部渲染。您不希望每行都有一个提交按钮。一次提交所有行。。您只需提交表单集所在的表单。谢谢-我想可能是这样的。好的,把按钮放在桌子外面。实际提交数据需要进行哪些更改?如何使提交数据的行消失?现在我只在选项为空的情况下提取数据。那么,有没有一种方法可以在同一页面上呈现,从而再次执行该筛选器?如果是post,则会传递post数据。。如果是GET,则不会传递任何消息,这是您想要的行为。Django一开始让人困惑的一点是,表单/表单集总是需要他们正在处理的对象/查询集,无论是get还是post。yea
modelformset=MyFormSet(request.post或None,queryset=modelObjects)
然后使用该modelformset,无论它是get还是post。。。另外,你可以简化你的逻辑。。您总是要在最后进行渲染,因此只需将其从if/else块中去掉即可,只需..'如果request.method==POST。。然后,如果表单集有效,则保存。不要在那里渲染。如果不是一个职位。。没有别的。。只需在底部渲染。
['ManagementForm data is missing or has been tampered with']