Używam Django 1.4 i chcę ustawić zasady sprawdzania poprawności, które porównują wartości różnych inlines.Walidacja zależnych inlines w django admin
Mam trzy proste zajęcia
W 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)
W admin.py:
class ItemInline(admin.TabularInline):
model = Item
class BuyerInline(admin.TabularInline):
model = Buyer
class ShoppingAdmin(admin.ModelAdmin):
inlines = (ItemInline, BuyerInline)
Tak na przykład możliwe jest, aby kupić butelkę rhum w 10 $ i jedna wódka w cenie 8 $. Mike płaci 15 $, a Tom płaci 3 $.
Celem jest uniemożliwienie użytkownikowi zapisania instancji z sumami, które nie pasują: kwota zapłacona musi być taka sama jak suma kosztów przedmiotu (np. 10 + 8 = 15 + 3).
Próbowałem:
- podnoszenie ValidationError w metodzie Shopping.clean. Jednak inlines nie są jeszcze zaktualizowane, więc sumy nie są poprawne.
- Podnoszenie ValidationError w metodzie ShoppingAdmin.save_related. Ale podniesienie tutaj ValidationError daje bardzo nieprzyjazną stronę błędu użytkownika zamiast przekierowania na stronę zmiany z ładnym komunikatem o błędzie.
Czy istnieje rozwiązanie tego problemu? Czy walidacja po stronie klienta (javascript/ajax) jest najprostsza?
Witam, wymyśliłeś coś dla tego? Mam taki sam problem. Jedyne rozwiązanie, jakie mogę wymyślić, to czysta metoda wbudowanego modelu, ale spowodowałoby to duże obciążenie bazy danych. – ppetrid
Domyślam się, że jednym z rozwiązań jest zmiana zachowania administratora django. Spójrz na django/contrib/admin/options.py, linia metodowa add_view 924 – Rems