0

on_deleteこのオプションは、既存の外部キーを削除するときに、別の外部キー オブジェクトを代替として設定できることを認識しています。しかし、私のクライアントが望んでいるのはこのフローです:

  1. 削除ボタンをクリックします (管理画面の変更ページまたは一覧ページから)
  2. このオブジェクトに子要素がある場合は、使用可能なすべての外部キー オブジェクトを一覧表示する選択ボックスを表示します。選択したオブジェクトは、これらの子オブジェクトの外部キーを設定するために使用されます。
  3. 子オブジェクトが別の外部キーに転送されたら、削除の確認ボタンを提供します。

Django管理者でこれを行う方法を知っている人はいますか? Wordpress には、たとえばユーザーを削除するときに、これと同様の機能があります。記事を別のユーザーに転送するオプションを提供します。

4

2 に答える 2

0

記述したフローを取得するには、独自のビューを作成する必要があります。Django Admin では実行できません。

Django Admin はそれ自体がアプリケーションであり、独自のアプリケーションを作成するために使用するフレームワークやライブラリではありません。

于 2013-03-26T13:17:10.453 に答える
0

アイテム.モデル.py

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

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

<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

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);
}

@goldhand要旨

于 2013-08-26T08:54:22.247 に答える