Django modelformset_factory删除由can_delete标记的对象

时间:2017-12-04 02:06:42

标签: django python-3.x django-forms modelform

您好我有问题我已经制作了modelformset_factory并且在选项中我选择了can_delete = True现在我不知道如何将标记对象删除为'DELETE':True将其从数据库中删除。我试图在某些方面做到这一点,它没有工作。我也在django formsetmodels文档中寻找它,但这对我没有帮助。使用此选项can_delete = True我在我的html页面中获得了额外的复选框删除并标记他只打印我在打印机中的控制台: {'username':'sw','email':'a@gmail.com','city':'ss','code':12345,'id':,'DELETE':False}

将表单保存到数据库是有效的,但我不知道如何从数据库中删除标记的表单。

我会非常感谢你们的每一次帮助。

我在models.py

中使用了model中的modelformset_factory
class TestModel(models.Model):
username = models.CharField(max_length=120)
email = models.EmailField()
city = models.CharField(max_length=120)
code = models.IntegerField()
#W admin panelu za miast TestModel object bedzie username
def __str__(self):
    return self.username

然后我添加了我的views.py函数:

def django_modelformset(request):
TestModelFormset = modelformset_factory(TestModel, fields=['username', 'email', "city",
                                                           "code"], extra=1, can_delete=True)
formset = TestModelFormset(request.POST or None)

if formset.is_valid():
    for form in formset:
        print(form)

        print(form.cleaned_data)
        form.save()
context = {"formset": formset}
return render(request, "modelformset.html", context)

我的modelformset.html如下所示:

<form method="POST" action="">
{% csrf_token %}

{{ formset.management_form}}
{% for form in formset %}
<div>

    {{ form.as_p }}
    <hr/>
</div>
{% endfor %}
<input type="submit" value="Save">

1 个答案:

答案 0 :(得分:1)

我个人不得不这样做,但从文档来看,你似乎有几个选择。

  1. 在formset而不是每个表单上调用save。

    if formset.is_valid():
        formset.save()
    
  2. 如果你必须遍历每个表单,你可以这样。

    if formset.is_valid():
       for form in formset:
           print(form.cleaned_data)
           if form.cleaned_data["DELETE"]:
               # Do what you want with the form data
               # i.e. get the object from the database and delete it.
           else:
               form.save()
    
  3. 分别循环浏览已删除的表单。

    if formset.is_valid():        
        forms = formset.save(commit=False)
        for object in formset.deleted_objects:
            object.delete()