Sto usando Django 1.4 e voglio impostare regole di validazione che confrontino valori di linee diverse.Validazione delle linee dipendenti in django admin
Ho tre semplici classi
In models.py:
class Shopping(models.Model):
shop_name = models.CharField(max_length=200)
class Item(models.Model):
item_name = models.CharField(max_length=200)
cost = models.IntegerField()
item_shop = models.ForeignKey(Shopping)
class Buyer(models.Model):
buyer_name = models.CharField(max_length=200)
amount = models.IntegerField()
buyer_shop = models.ForeignKey(Shopping)
In admin.py:
class ItemInline(admin.TabularInline):
model = Item
class BuyerInline(admin.TabularInline):
model = Buyer
class ShoppingAdmin(admin.ModelAdmin):
inlines = (ItemInline, BuyerInline)
Così, per esempio, è possibile acquistare una bottiglia di rhum a 10 $ e uno di vodka a 8 $. Mike paga 15 $ e Tom paga 3 $.
L'obiettivo è impedire all'utente di salvare un'istanza con somme non corrispondenti: ciò che è stato pagato deve essere uguale alla somma dei costi dell'articolo (ovvero 10 + 8 = 15 + 3).
Ho provato:
- alzando ValidationError nel metodo Shopping.clean. Ma gli inline non sono ancora aggiornati in modo pulito quindi le somme non sono corrette
- innalzamento di ValidationError nel metodo ShoppingAdmin.save_related. Tuttavia, sollevando ValidationError, viene visualizzata una pagina di errore molto scortese da parte dell'utente, anziché reindirizzare alla pagina di modifica con un messaggio di errore.
C'è qualche soluzione a questo problema? La validazione lato client (javascript/ajax) è la più semplice?
ciao, hai inventato qualcosa per questo? Affronto lo stesso identico problema. L'unica soluzione che riesco a pensare è il metodo pulito del modello in linea, ma questo produrrebbe un grande sovraccarico di db. – ppetrid
Immagino che una soluzione sia quella di modificare il comportamento dell'amministratore di django. Guarda django/contrib/admin/options.py, la linea del metodo add_view 924 – Rems