복붙노트

[PYTHON] 장고 : unique_together 오류 메시지를 재정의하는 방법?

PYTHON

장고 : unique_together 오류 메시지를 재정의하는 방법?

모델의 메타 클래스에서 unique_together를 정의합니다. 이 모델을 기반으로 한 ModelForm이 있습니다. 이 ModelForm에서 is_valid를 호출하면 unique_together 유효성 검사가 실패 할 경우 오류가 자동으로 발생합니다. 그게 다 좋다.

이제 내 문제는 기본 unique_together 오류 메시지가 만족스럽지 않다는 것입니다. 나는 그것을 무시하고 싶다. 어떻게해야합니까? 필드 관련 오류의 경우 필드 매개 변수에 error_messages를 설정하여이를 쉽게 수행 할 수 있습니다. 그러나 unique_together는 필드가 아닌 오류입니다. 비 필드 오류 메시지를 무시하려면 어떻게해야합니까?

해결법

  1. ==============================

    1.당신은 장고 1.7에서 이것을 할 수있다.

    당신은 장고 1.7에서 이것을 할 수있다.

    from django.forms import ModelForm
    from django.core.exceptions import NON_FIELD_ERRORS
    
    class ArticleForm(ModelForm):
        class Meta:
            error_messages = {
                NON_FIELD_ERRORS: {
                    'unique_together': "%(model_name)s's %(field_labels)s are not unique.",
                }
            }
    
  2. ==============================

    2.업데이트 2016/10/20 : Django> = 1.7에 대한 jifeng-yin의 더 멋진 답변보기

    업데이트 2016/10/20 : Django> = 1.7에 대한 jifeng-yin의 더 멋진 답변보기

    이러한 오류 메시지를 무시하는 가장 좋은 방법은 모델의 unique_error_message 메서드를 재정의하는 것일 수 있습니다. Django는이 메서드를 호출하여 유효성 검사 중에 고유성 문제가 발생할 때마다 오류 메시지를 가져옵니다.

    당신은 단지 원하는 특정 케이스를 처리 할 수 ​​있고, 다른 모든 케이스는 Django에서 평소처럼 처리 할 수 ​​있습니다 :

    def unique_error_message(self, model_class, unique_check):
        if model_class == type(self) and unique_check == ('field1', 'field2'):
            return 'My custom error message'
        else:
            return super(Project, self).unique_error_message(model_class, unique_check)
    
  3. ==============================

    3.빠른 점검 후, unique_together 유효성 검증 오류가 django.db.models.Model.unique_error_message의 하드 코딩 된 것 같습니다.

    빠른 점검 후, unique_together 유효성 검증 오류가 django.db.models.Model.unique_error_message의 하드 코딩 된 것 같습니다.

    def unique_error_message(self, model_class, unique_check):
        opts = model_class._meta
        model_name = capfirst(opts.verbose_name)
    
        # A unique field
        if len(unique_check) == 1:
            field_name = unique_check[0]
            field_label = capfirst(opts.get_field(field_name).verbose_name)
            # Insert the error into the error dict, very sneaky
            return _(u"%(model_name)s with this %(field_label)s already exists.") %  {
                'model_name': unicode(model_name),
                'field_label': unicode(field_label)
            }
        # unique_together
        else:
            field_labels = map(lambda f: capfirst(opts.get_field(f).verbose_name), unique_check)
            field_labels = get_text_list(field_labels, _('and'))
            return _(u"%(model_name)s with this %(field_label)s already exists.") %  {
                'model_name': unicode(model_name),
                'field_label': unicode(field_labels)
            }
    

    따라서 모델에서이 메서드를 재정 의하여 직접 메시지를 삽입해야합니다.

    그러나, 나는 시도하지 않고, 그것은 다소 잔인한 해결책으로 보인다! 그러나 당신이 더 좋은 것을 가지고 있지 않다면, 당신은 시도해 볼 수도 있습니다 ...

  4. ==============================

    4.Notice :이 대답 이후 장고에서 많은 변화가있었습니다. 그래서 다른 답변을 더 잘 확인하십시오 ...

    Notice :이 대답 이후 장고에서 많은 변화가있었습니다. 그래서 다른 답변을 더 잘 확인하십시오 ...

    sebpiq가 참인 경우 (소스 코드를 확인하지 않기 때문에) 당신이 할 수있는 가능한 해결책이지만 어려운 방법입니다 ...

    여기에 설명 된대로 양식에 유효성 검사 규칙을 정의 할 수 있습니다

    하나 이상의 필드에서 유효성 검증의 예제를 볼 수 있으므로이 메소드를 사용하여 표준 장고 고유 검사가 실행되기 전에 고유 한 검사를 정의 할 수 있습니다.

    또는 최악의 경우, 개체를 저장하기 전에보기에서 유효성 검사를 수행 할 수 있습니다.

  5. ==============================

    5.모델에서 django / db / models / base.py : Model._perform_unique_checks ()를 재정의 (override) 할 수 있습니다.

    모델에서 django / db / models / base.py : Model._perform_unique_checks ()를 재정의 (override) 할 수 있습니다.

    이 방법으로 "원래"오류를 얻을 수 있습니다.

        errors = super(MyModel, self)._perform_unique_checks(unique_checks)
    

    - 그 다음 그것을 수정하고 위로 돌려라.

  6. from https://stackoverflow.com/questions/3993560/django-how-to-override-unique-together-error-message by cc-by-sa and MIT license