2011-01-19 24 views
11

Hãy tha thứ cho tôi nếu điều này đã được trả lời trước đó, tôi không thể tìm thấy câu trả lời mà xác thực phụ thuộc vào tổng hợp các biểu mẫu nội tuyến.Xác thực quản trị viên Django cho biểu mẫu nội tuyến dựa trên tổng số trường giữa tất cả các biểu mẫu

Nền tảng nhỏ: Tôi đang làm một trang web cho một nhà môi giới bảo hiểm có 'Chính sách' và 'Tổng hoa hồng' của chính sách đó. Ngoài ra còn có 'Người bán lại' được thêm vào 'Chính sách' cùng với hoa hồng đi đến họ (có thể có bất kỳ số người bán lại nào). Tổng hoa hồng giữa các đại lý phải nhỏ hơn tổng số tiền hoa hồng.

Tôi có quản trị viên.ModelForm dành cho chính sách và bên dưới tôi có quản trị viên.InlineTabular có thể có nhiều người bán lại thông qua nút 'Thêm' và tất cả đều hoạt động hoàn hảo. Tuy nhiên, tôi dường như không thể tìm ra cách để xác nhận chúng, để tôi có thể thêm tất cả tiền hoa hồng và sau đó nếu nó lớn hơn tổng số tiền hoa hồng, hãy ném một ValidationError.

Tôi đã thử làm sạch() nhưng không biết cách truy cập dữ liệu đã được làm sạch InlineTabular nếu nó có sẵn!

Cảm ơn bạn đã giúp đỡ!

Thomas

+0

câu hỏi tương tự: http: // stackoverflow .com/questions/877723/inline-form-validation-in-django – utapyngo

Trả lời

19

Tôi biết các câu hỏi đã được hỏi một thời gian dài trước đây, nhưng kể từ khi tôi phải vật lộn với vấn đề tương tự, tôi nghĩ rằng nó có thể có ích.

Chìa khóa ở đây là xác định một bộ định dạng tùy chỉnh để nhúng vào biểu mẫu quản trị dạng bảng, sau đó ghi đè lên phương thức làm sạch của bộ định dạng.

Dưới đây là một ví dụ: một thành phần được làm bằng composition_elements, mỗi composition_element có một lĩnh vực phần trăm, và tôi muốn xác nhận rằng tổng phần trăm là bằng 100.

from django import forms 
from django.forms.models import BaseInlineFormSet 
from django.core.exceptions import ValidationError 
from django.utils.translation import ugettext_lazy as _ 
from django.contrib import admin 
from .models import Composition, CompositionElement 

class CompositionElementFormSet(BaseInlineFormSet): 
    ''' 
    Validate formset data here 
    ''' 
    def clean(self): 
     super(CompositionElementFormSet, self).clean() 

     percent = 0 
     for form in self.forms: 
      if not hasattr(form, 'cleaned_data'): 
       continue 
      data = form.cleaned_data 
      percent += data.get('percent', 0) 

     if percent != 100: 
      raise ValidationError(_('Total of elements must be 100%%. Current : %(percent).2f%%') % {'percent': percent}) 

class CompositionElementAdmin(admin.TabularInline): 
    model = CompositionElement 
    formset = CompositionElementFormSet 

class CompositionAdmin(admin.ModelAdmin): 
    inlines = (CompositionElementAdmin,) 

admin.site.register(Composition, CompositionAdmin) 
+0

Điều này khiến tôi mãi mãi tìm thấy, nhưng tôi biết rằng phải có một cách đơn giản. Cảm ơn. – Cerin

+0

Theo [câu trả lời này] (http://stackoverflow.com/a/14031135/25507), bạn nên kiểm tra 'form.cleaned_data ['DELETED']' cũng như 'không form.cleaned_data'. –

Các vấn đề liên quan