【问题标题】:Django Delete Button Action for ModelFormsetModelFormset 的 Django 删除按钮操作
【发布时间】:2016-03-02 23:40:36
【问题描述】:

我有一个模型表单集,如下所示:

views.py

def manage_authors(request):
    AuthorFormSet = modelformset_factory(Author, fields=('name', 'title', 'birth_date'))
    if request.method == 'POST':
        if "del_btn" in request.POST:
            query = Author.objects.get(...).delete()
            formset = AuthorFormSet(request.POST, request.FILES)
            if formset.is_valid():
                formset.save()
                formset = AuthorFormSet(queryset=Author.objects.all())
                print "yes"
        else:
            formset = AuthorFormSet(request.POST, request.FILES)
            if formset.is_valid():
                formset.save()
                formset = AuthorFormSet(queryset=Author.objects.all())
    else:
        formset = AuthorFormSet(queryset=Author.objects.all())
    return render(request, "manage_authors.html", {"formset": AuthorFormSet, })

ma​​nage_authors.html

<form method="post" action="/manage_authors.html">{% csrf_token %}
{{ formset.management_form }}
{% for form in formset %}
    {{ form.id }}
    <ul>
        {{ form.name }} {{ form.title }} {{ form.birth_date }}
        <input type="submit" name="del_btn" value="Delete"/>
    </ul>
{% endfor %}
<input type='submit' name="edit_btn" value='Edit / Add'/>

我可以定义什么查询以使“删除”按钮起作用?

现在,我不知道必须删除哪一行。

提前致谢

【问题讨论】:

    标签: django django-models django-forms django-templates django-views


    【解决方案1】:

    首先我建议在 admin.py 中注册你的用户模型:

    admin.site.register(Author)
    

    Django 将处理剩下的事情。

    但是,如果您想使用此代码执行此操作,请执行以下操作:

    <form method="post" action="/manage_authors.html">{% csrf_token %}
    {{ formset.management_form }}
     for form in formset %}
        {{ form.id }}
        <ul>
            {{ form.name }} {{ form.title }} {{ form.birth_date }}
        <input type="submit" name="del_btn{{ form.instance.id }}" value="Delete"/>
    </ul>
    {% endfor %}
    <input type='submit' name="edit_btn" value='Edit / Add'/>
    

    这样对象的主键就会与删除按钮的名称相关。

    现在,在 views.py 中:

    import re, urllib
    
    def manage_authors(request):
        AuthorFormSet = modelformset_factory(Author, fields=('name', 'title', 'birth_date'))
        if request.method == 'POST':
            enurl=urllib.urlencode(request.POST)  # To convert POST into a string
            matchobj=re.search(r'del_btn\d', enurl)  # To match for e.g. del_btn1
            btnname=matchobj.group()  # Contains matched button name
            pri_key=btname[-1]  # slice the number of btn to identify primarykey 
            if matchobj:
                query = Author.objects.get(pk=pri_key).delete()
                formset = AuthorFormSet(request.POST, request.FILES)
                if formset.is_valid():
                    formset.save()
                    formset = AuthorFormSet(queryset=Author.objects.all())
                    print "yes"
            else:
                formset = AuthorFormSet(request.POST, request.FILES)
                if formset.is_valid():
                    formset.save()
                    formset = AuthorFormSet(queryset=Author.objects.all())
        else:
            formset = AuthorFormSet(queryset=Author.objects.all())
    
        return render(request, "manage_authors.html", {"formset": AuthorFormSet, })
    

    【讨论】:

    • 我没有使用 {{ form.id }},而是使用了 {{ form.instance.id}} 并且它有效。重要的是将 {{ form.id }} 添加到模板中,这样 MultiValueDictKeyError 就不会被抛出。谢谢@Yugandhar
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多