2013-07-27 9 views
5

Według https://docs.djangoproject.com/en/dev/ref/forms/validation/Django ValidationError

# Good 
    ValidationError(
     _('Invalid value: %(value)s'), 
     params={'value': '42'}, 
    ) 

    # Bad 
    ValidationError(_('Invalid value: %s') % value) 

Docs nie robi naprawdę wyjaśnić, dlaczego jest źle/dobrze. Czy ktoś może podać konkretny przykład?

Ponadto, gdy sprawdzam form.errors, otrzymuję coś w rodzaju 'Invalid: %(value)s'. W jaki sposób uzyskać params od błędu sprawdzania poprawności i interpolować je do komunikatów o błędach?

Zmieniano

Więc to jest uważane za dobre?

ValidationError(
     _('Invalid value: %(value)s') % {'value': '42'}, 
    ) 

Myślę, że prawdziwe pytanie brzmi: dlaczego przekazać zmienne osobno poprzez params argumentu? Dlaczego nie interpolować bezpośrednio do msg błędu (zignoruj ​​na razie nazwę lub interpolację pozycyjną) ???

Edited

Ok, od źródła @https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py I nie sądzę, że istnieje jakiś sposób, aby odzyskać params ValidationError od czasu Formularz robi nie nawet uratować samego obiektu ValidationError. Zobacz kod poniżej.

class ValidationError(Exception): 
    """An error while validating data.""" 
    def __init__(self, message, code=None, params=None): 
     import operator 
     from django.utils.encoding import force_text 
     """ 
     ValidationError can be passed any object that can be printed (usually 
     a string), a list of objects or a dictionary. 
     """ 
     if isinstance(message, dict): 
      self.message_dict = message 
      # Reduce each list of messages into a single list. 
      message = reduce(operator.add, message.values()) 

     if isinstance(message, list): 
      self.messages = [force_text(msg) for msg in message] 
     else: 
      self.code = code 
      self.params = params 
      message = force_text(message) 
      self.messages = [message] 

class Form: 
    .... 
    def _clean_fields(...): 
     .... 
     except ValidationError as e: 
      self._errors[name] = self.error_class(e.messages) # Save messages ONLY 
      if name in self.cleaned_data: 
       del self.cleaned_data[name] 

Odpowiedz

2

Jeśli masz wiele parametrów, mogą one pojawiać się w innej kolejności podczas tłumaczenia komunikatu o błędzie.

Nazwane argumenty umożliwiają zmianę kolejności wyświetlania argumentów, bez zmiany params. Z krotką argumentów, kolejność jest ustalona.

Pamiętaj, że łączysz się z wersją rozwojową dokumentacji Django. Błąd sprawdzania poprawności nie interpoluje parametrów, ponieważ używasz Django 1.5 lub wcześniejszego. Jeśli wypróbujesz swój kod w wersji 1.6 beta, parametry zostaną interpolowane na komunikat o błędzie.

+0

następnie moje pytanie brzmi: dlaczego nie użyć 'ValidationError ( _ ('Nieprawidłowa wartość:% (wartość) S')% { 'wartość ": '42'}, )' – Lucas

+0

pls zobacz moją edycję powyżej – Lucas

+0

Jeśli wymienisz zmienne bezpośrednio na wiadomość, trudniej jest ją przesłonić. Na przykład nie można używać symboli zastępczych podczas używania argumentu ['error_messages'] (https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages). – Alasdair

2

ValidationError jest przechwycony przez procedurę sprawdzania poprawności formularza i chociaż może po prostu pokazać komunikat, lepiej zapisać możliwość otrzymania błędu: params; na przykład. nazwa pola, wartość, która spowodowała błąd i tak dalej. Jest to podane tuż przed podanym przykładem.

Aby komunikaty o błędach, elastyczne i łatwe do nadpisania

+0

pls patrz moja edycja powyżej – Lucas

Powiązane problemy