1

변수 foo가 MyModel 및 Item에 대해 m2m으로 추가되기 전에 동일하다는 것을 확인하려고합니다. 관리자가 아니라면 ValidationError를 발생시키고 싶습니다.django에서 m2m_changed 신호의 유효성 검사 오류가 표시됩니다.

models.py

class Item(models.Model): 
    foo = models.CharField(max_length=200)  

class MyModel(models.Model): 
    foo = models.CharField(max_length=200) 
    items = models.ManyToManyField(Item) 

signals.py

@receiver(m2m_changed, sender=MyModel.items.through) 
def my_validator(sender, instance, action, pk_set, **kwargs): 
    if action == 'pre_add': 
     if Item.objects.filter(id__in=pk_set, foo=instance.foo).count() != len(pk_set): 
      raise ValidationError({'items': ["Foo doesn't match"]}) 

은 ValidationError가 500 오류로 적절히 관리 및하지 표시 할 수있는 방법이 있습니까.

MyModel의 clean 메소드를 사용하여 foo와 동일한 값을 검증하는 솔루션을 찾을 수 없었습니다. 모든 조언을 부탁드립니다.

답변

1

form 클래스를 만들고 clean 메서드를 사용하고 관리자 클래스를 수정하여 양식을 사용하십시오. this 읽기 :

처럼을 :

@admin.register(MyModel) 
class MyModelAdmin(admin.ModelAdmin): 
    search_fields = ('foo', 'items__foo') 
    list_display = ('foo', 'items__foo') 
    form = MyModelForm 


class MyModelForm(forms.ModelForm): 

    def clean(self): 
     """ 
     This is the function that can be used to 
     validate your model data from admin 
     """ 
     super(MyModelForm, self).clean() 
     foo = self.cleaned_data.get('foo') 
     pk_set = Item.objects.all().values_list("id") 

     # The logic you were trying to filter.. 
     if Item.objects.filter(id__in=pk_set).count() != len(pk_set): 
      raise ValidationError({'items': ["Foo doesn't match"]}) 
+0

당신을 감사합니다! ModelForm을 만들고 거기에서 검증함으로써 트릭을 만들었습니다. 그러나 pk_set을 self.cleaned_data.get ("items")으로 설정했습니다. 왜 Item.objects.all()을 사용하는지 잘 모르겠습니다. 다시 한 번 감사드립니다! – Maxim

+0

@Maxim 필자가 저장하고 사용하기를 원하는 pk_set이 정확히 무엇인지 알지 못했기 때문에 Item 테이블의'pk' 값이 될 것이므로'Item.object.all()'이라고 생각했습니다. 어쨌든, 당신은 환영합니다. :) –

+0

걱정하지 않아도, 실제 유효성 확인 논리는 실제로 적합하지 않습니다. 도와 주셔서 감사합니다. 나에게 시간의 좋은 덩어리를 구해줬다! 건배 – Maxim