【问题标题】:Django modelformset_factory deleting objects marked by can_deleteDjango modelformset_factory 删除由 can_delete 标记的对象
【发布时间】:2018-05-17 10:57:06
【问题描述】:

您好,我有一个问题,我已经创建了 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中的模型制作了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">

【问题讨论】:

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


    【解决方案1】:

    我个人不必这样做,但从文档看来,您有几个选择。

    1. 在表单集而不是每个表单上调用 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()
      

    【讨论】:

    • 第一种方法对我有用,稍后我将测试另外 2 个方法,谢谢您的帮助。
    • 方法3成功了,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-14
    • 2018-12-14
    相关资源
    最近更新 更多