python form - Django ModelChoiceField-usa qualcosa di diverso dall'ID?





custom validation (4)


Che dire to_field_name ? Non sono sicuro che sia documentato ovunque, ma lo puoi trovare facilmente tra i parametri del costruttore ModelChoiceField : https://github.com/django/django/blob/master/django/forms/models.py . È usato per filtrare il campo queryset.

Per esempio:

articles = ModelChoiceField(queryset=Articles.objects.all(),
        to_field_name='slug')

Supponiamo che abbia una tabella degli address e che disponga di un campo postal_code : ModelChoiceField non mi consente di utilizzare qualcosa di diverso dai PK per convalidare l'esistenza corretta? Quale sarebbe la strada da percorrere? Ingresso normale e uso clean_*() ?




ModelChoiceFields sono pensati per essere utilizzati per selezionare tra una scelta di istanze di modelli esistenti. Questo è quasi sempre meglio rappresentato da una qualche forma di campo Seleziona.

Detto questo, hai davvero un FK dall'indirizzo a CAP_code come stai insinuando. Cosa stai memorizzando su una tabella PostalCode per giustificare la tabella aggiuntiva che dovrà essere aggiunta per ogni query relativa all'indirizzo?

Per la maggior parte dei casi, postal_code dovrebbe essere semplicemente un CharField e in tal caso, se si desidera verificare che il valore sia valido, è possibile utilizzare l'attributo choices con un elenco di codici postali validi. Tieni presente che mantenere una lista di codici postali validi a mano è una seccatura enorme.

Se hai davvero una tabella PostalCode e pensi che sia una buona idea (che in alcuni casi potrebbe essere) potresti prendere in considerazione l'utilizzo del codice postale come chiave primaria piuttosto che l'autoincremento predefinito poiché è necessariamente univoco, rende i tuoi dati più esportabili e risolve il problema con la convalida.




Se postal_code è una chiave esterna di un modello PostalCode che contiene codici postali validi, utilizzerei solo un CharField e quindi eseguo una pulizia come suggerito. Il mio metodo pulito sarebbe simile a questo:

def clean_postal_code(self):
    try:
        code = PostalCode.objects.get(code_field=self.data['postal_code'])
    except:
        raise forms.ValidationError("Please enter a valid postal code")
    return code



Ho appena trovato wdb ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). Ha un'interfaccia utente / interfaccia grafica carina con tutte le campane e i fischietti. L'autore dice questo su wdb -

"Ci sono IDE come PyCharm che hanno i propri debugger, offrono un insieme simile o uguale di funzionalità ... Comunque per utilizzarli devi usare quegli specifici IDE (e alcuni di questi non sono gratuiti o potrebbero non essere disponibili per tutti piattaforme). Scegli lo strumento giusto per le tue esigenze. "

Pensavo che lo avrei appena passato.

Anche un articolo molto utile sui debugger di Python: https://zapier.com/engineering/debugging-python-boss/

Infine , se vuoi vedere una bella stampa grafica del tuo stack di chiamate in Django, controlla: https://github.com/joerick/pyinstrument . Basta aggiungere pyinstrument.middleware.ProfilerMiddleware a MIDDLEWARE_CLASSES, quindi aggiungere? Profile alla fine dell'URL di richiesta per attivare il profiler.

Puoi anche eseguire pyinstrument dalla riga di comando o importando come modulo.





python django validation django-forms django-validation