2017-06-08 1 views
1

Ich benutze das Standard-Admin-Dashboard von Django. Grundsätzlich möchte ich die delete_selected-Methode modellweise übersteuern, damit ich nach Datensätzen suchen kann, bevor das Löschen zugelassen wird.Override delete_selected, um nach Datensätzen zu suchen, die in anderen Tabellen in Django vorhanden sind 1.10

Mein models.py ist:

class Kind(models.Model): 

    name = models.CharField(max_length=50, unique=True) 
    addedby = models.ForeignKey(User,related_name='admin_kind') 
    createdon = models.DateTimeField(auto_now_add=True) 
    updatedon = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return self.name 

    class Meta: 
     ordering = ('name',) 


class Item(models.Model): 

    name = models.CharField(max_length=50) 
    kind = models.ForeignKey(Kind,related_name="item_kind") 
    createdon = models.DateTimeField(auto_now_add=True) 
    updatedon = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return ' , '.join([self.kind.name, self.name]) 

    class Meta: 
     ordering = ('kind', 'name',) 
     unique_together = (('name','kind')) 

Nun, was ich will, ist, bevor eine Art gelöscht werden konnte, ich überprüfen möchten, ob es einen Bezugsdatensatz in Artikel ist. Wenn dies der Fall ist, löschen Sie es nicht.

Aber ich bin fest, wie über delete_selected Methode in admin.py überschrieben werden.

def delete_selected(self, request, obj): 
    ''' 
    Delete Kind only if there are no items under it. 
    ''' 
    for o in obj.all(): 
     featuredItems = Item.objects.filter(kind=o).count() 
     if featuredItems == 0: 
      o.delete() 

Allerdings zeigt django die Warnung und wenn ich ja klicken, löscht er die Art, obwohl es Aufzeichnungen für sie. Ich möchte die Löschung absolut blockieren.

Antwort

2

Eigentlich versuchen Sie, eine Menge Code für etwas zu schreiben, die lediglich durch Hinzufügen eines Attributs zu Ihrem Modellfeld durch Anheben ProtectedError, eine Unterklasse von django

PROTECT Prevent Löschen des referenzierten Objekts durchgeführt werden kann. db.IntegrityError.

class Item(models.Model): 

    name=models.CharField(max_length=50) 
    kind=models.ForeignKey(Kind,related_name="item_kind", on_delete=models.PROTECT) 

Was Sie versuchen zu erreichen, wird noch schwieriger durch die Tatsache, dass django eine Bestätigungsseite auf Löschen anzeigt.

+0

Das ist wirklich toll !! Es hat tatsächlich den Trick gemacht. –

1

Der Funktionscode ist korrekt, aber Sie müssen explizit django anweisen, Ihre eigenen Funktionen zu verwenden, um die Objekte dieses Modells zu löschen. Sie tun können, dass durch eine Liste in Ihrem admin.py erklärt,

actions = ['delete_selected'] 

Wo „delete_selected“ ist Ihre Funktionsnamen.

+0

Danke! Das hat den Trick gemacht. –

+0

Sie können meine Antwort verbessern, wenn es Ihnen hilft .. Danke. –

Verwandte Themen