首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在删除Django中的foreignkey对象之前转移所有子对象?

如何在删除Django中的foreignkey对象之前转移所有子对象?
EN

Stack Overflow用户
提问于 2013-03-26 12:11:52
回答 2查看 359关注 0票数 0

我知道on_delete选项可以在删除现有的foreignkey时设置另一个foreignkey对象作为替代。但我的当事人想要的是这种流动:

  1. 单击“删除”按钮(从管理中的更改页或列表页)
  2. 如果该对象有子元素,则显示一个复选框,列出所有可用的foreignkey对象。所选对象将用于填充这些子对象的“外键”。
  3. 子对象被转移到另一个外键后,提供“确认删除”按钮。

有没有人知道我怎么能在Django管理上做到这一点?例如,在删除用户时,Wordpress具有类似的功能。它提供了将文章传递给其他用户的选项。

EN

Stack Overflow用户

发布于 2013-08-26 08:54:22

items.models.py

代码语言:javascript
运行
复制
from django.db import models


class Slugged(models.Model):
    title = models.CharField(max_length=500)
    slug = models.CharField(max_length=2000, blank=True, null=True)

    class Meta:
        abstract = True

    def __unicode__(self):
        return self.title


class Item(Slugged):
    # SET_NULL for safety
    category = models.ForeignKey("Category", blank=True, null=True, on_delete=models.SET_NULL)


class Category(Slugged):
    pass

items.views.py

代码语言:javascript
运行
复制
from django.views import generic
from django.views.generic.edit import FormMixin

from jsonview.decorators import json_view
# this is from @jsocol/django-jsonview but there are other ways to do this

from .models import Item, Category


class CategoryUpdateView(generic.UpdateView):
    model = Category

    def get_context_data(self, **kwargs):
        self.object = super(CategoryUpdateView, self).get_object()
        context = super(CategoryUpdateView, self).get_context_data(**kwargs)
        context['available_fks'] = Category.objects.exclude(pk=self.object.id)      
        context.update(kwargs)
        return super(CategoryUpdateView, self).get_context_data(**kwargs)


class CategoryDeleteView(generic.DeleteView, FormMixin):
    model = Task
    success_url = '/'

    @json_view
    def dispatch(self, *args, **kwargs):
        return super(CategoryDeleteView, self).dispatch(*args, **kwargs)

    def delete(self, request, *args, **kwargs):
        self.object = super(CategoryDeleteView, self).get_object()
        self.object.delete()
        return {'success':True}

    def post(self, request, *args, **kwargs):
        self.object = super(CategoryDeleteView, self).get_object()
        if request.POST.has_key('new_fk'):
            new_fk = get_object_or_404(Category, pk=request.POST['new_fk'])
            for item in self.object.item_set.all():
                item.category = new_fk
                item.save()
        else:
            return {'success': False}
        return self.delete(self, request, *args, **kwargs)

items.templates.items.category_update.html

代码语言:javascript
运行
复制
<form action="" method="post" enctype="multipart/form-data" id="category-delete-form">
    {% csrf_token %}
    {{ form }}
    <select id="new_fk">
        <option value="" >---------</option>
        {% for fk in available_fks %} 
             <option value="{{ fk.if }}"{% if forloop.first %} selected="selected"{% endif %}>{{ fk.title }}</option>
        {% endfor %}
    </select>
    <input type="submit" name="delete_category" value="Delete">
</form>

items.static.items.deleteItem.js

代码语言:javascript
运行
复制
function deleteCategory(deleteUrl, form_id) {
    var $form = $('#' + form_id);
    var new_pk = $form.find('#new_fk').val();
    $.ajax({
        url: deleteUrl,
        type: 'POST',
        data: 'csrfmiddlewaretoken=' + getCookie('csrftoken') + '&new_fk=' + new_fk,
        success: function(data) {
            if (data['success']){
                $form.remove();
                alert('success');
            }
            else {
                alert('FAIL');
            }

        }
    });
}
$('#category-delete-form').on('submit', function () {
    $this = $(this);
    deleteCategory($this.attr('action'), $this.id);
}

@黄金手要旨

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15636793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档