2010-10-04 32 views
6

Vui lòng xem mã bên dưới. Về cơ bản, khi người dùng tạo đối tượng của lớp này, họ cần phải chỉ định value_type. Nếu value_type==2 (tỷ lệ phần trăm), thì percentage_calculated_on (là một CheckboxSelectMultiple ở phía biểu mẫu/mẫu cần phải có một hoặc nhiều mục được chọn. Xác thực mô hình không cho phép tôi xác thực như tôi đang cố gắng - về cơ bản nó ném một ngoại lệ cho tôi biết rằng cá thể cần phải có một giá trị khóa chính trước khi một mối quan hệ nhiều-nhiều có thể được sử dụng.Nhưng tôi cần phải xác nhận hợp lệ đối tượng trước khi lưu nó. Tôi đã thử xác nhận này ở phía form (modelform) (sử dụng phương pháp sạch của mẫu), nhưng điều tương tự xảy ra ở đó quá.django manytomany validation

làm thế nào để đi về việc đạt được xác nhận điều này?

INHERENT_TYPE_CHOICES = ((1, 'Payable'), (2, 'Deductible')) 
VALUE_TYPE_CHOICES = ((1, 'Amount'), (2, 'Percentage')) 

class Payable(models.Model): 
    name = models.CharField() 
    short_name = models.CharField() 
    inherent_type = models.PositiveSmallIntegerField(choices=INHERENT_TYPE_CHOICES) 
    value = models.DecimalField(max_digits=12,decimal_places=2) 
    value_type = models.PositiveSmallIntegerField(choices=VALUE_TYPE_CHOICES) 
    percentage_calculated_on = models.ManyToManyField('self', symmetrical=False) 

    def clean(self): 
     from django.core.exceptions import ValidationError 
     if self.value_type == 2 and not self.percentage_calculated_on: 
      raise ValidationError("If this is a percentage, please specify on what payables/deductibles this percentage should be calculated on.") 
+0

Tôi đã đánh dấu câu trả lời của Manoj Govindan dưới đây là "được chấp nhận" vì giải quyết được sự cố. Tuy nhiên, tôi vẫn muốn có nó xác nhận bằng cách sử dụng xác thực mô hình của Django. Vì vậy, nếu bất cứ ai có bất kỳ ý tưởng nào, hãy cố gắng đăng nó ở đây. Cảm ơn. – chefsmart

+0

cùng một câu hỏi: http://stackoverflow.com/questions/7986510/django-manytomany-model-validation – user920391

Trả lời

2

tôi đã thử nghiệm ra mã của bạn trong một trong proje của tôi ứng dụng quản trị của cts. Tôi đã có thể thực hiện xác thực mà bạn yêu cầu bằng cách sử dụng tùy chỉnh ModelForm. Xem bên dưới.

# forms.py 
class MyPayableForm(forms.ModelForm): 
    class Meta: 
     model = Payable 

    def clean(self): 
     super(MyPayableForm, self).clean() # Thanks, @chefsmart 
     value_type = self.cleaned_data.get('value_type', None) 
     percentage_calculated_on = self.cleaned_data.get(
      'percentage_calculated_on', None) 
     if value_type == 2 and not percentage_calculated_on: 
      message = "Please specify on what payables/deductibles ..." 
      raise forms.ValidationError(message) 
     return self.cleaned_data 

# admin.py 
class PayableAdmin(admin.ModelAdmin): 
    form = MyPayableForm 

admin.site.register(Payable, PayableAdmin) 

Ứng dụng Admin sử dụng SelectMultiple phụ tùng (chứ không phải CheckboxSelectMultiple như bạn làm) để đại diện cho nhiều đối với nhiều mối quan hệ. Tôi tin rằng điều này không quan trọng.

+0

Errr ... là 'mô hình' thực sự là một thuộc tính của' admin.ModelAdmin'? –

+0

@Dominic: Nó chắc chắn không phải là: P Cảm ơn bạn đã chỉ ra. Tôi đã sửa nó. –

+0

Tôi đang làm một cái gì đó tương tự trong ModelForm của tôi, ngoại trừ tôi gọi siêu (MyPayableForm, tự) .clean() đầu tiên và tôi sử dụng self.instance.value_type và self.instance.percentage_calculated_on thay thế. – chefsmart

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