2014-07-17 24 views
18

Ho un'app di Django molto semplice per registrare le conferenze fornite ai miei colleghi. Dato che è piuttosto elementare, sto usando l'admin Django stesso. Qui è la mia models.py:Convalida personalizzata nell'amministratore di Django

#models.py 
from django.db import models 

class Lecture(models.Model): 
    topic = models.CharField(max_length=100) 
    speaker = models.CharField(max_length=100) 
    start_date = models.DateField() 
    end_date = models.DateField() 

ho bisogno di garantire che nessuno entra nella data di inizio dopo la data di fine nelle forme di amministrazione, così ho letto la documentazione Django per la validazione personalizzato nel admin e implementato quanto segue in la mia admin.py:

#admin.py 
from models import Lecture 
from django.contrib import admin 
from django import forms 


class LectureForm(forms.ModelForm): 
    class Meta: 
     model = Lecture 

     def clean(self): 
      start_date = self.cleaned_data.get('start_date') 
      end_date = self.cleaned_data.get('end_date') 
      if start_date > end_date: 
       raise forms.ValidationError("Dates are incorrect") 
     return self.cleaned_data 


class LectureAdmin(admin.ModelAdmin): 
    form = LectureForm 
    list_display = ('topic', 'speaker', 'start_date', 'end_date') 

admin.site.register(Lecture, LectureAdmin) 

Tuttavia, questo non ha alcun effetto sulla mia amministrazione e io sono in grado di salvare le lezioni dove data_iniziale è dopo data_finale come si vede nell'immagine: enter image description here

che cosa sto facendo di sbagliato ??

risposta

14

Si verifica un problema di indentazione. Il tuo metodo clean è rientrato nella classe Meta del modulo. Spostalo indietro di un livello. Inoltre, assicurarsi che l'istruzione return sia rientrata all'interno del metodo.

+0

ha funzionato !! .. e ho quasi trascorso 2 ore a leggere i documenti per ottenere una correzione per esso !! .. Avevo un altro dubbio ... l'errore di convalida è stato sollevato solo quando ho creato una nuova voce. Per quelli esistenti, hanno continuato a esserci ... presumo che il metodo clean() venga chiamato solo quando un modello viene salvato. Come faccio a garantire che venga chiamato ogni volta che la pagina viene caricata? – Amistad

+1

@Amistad Il metodo 'clean' viene chiamato solo quando il modulo viene inviato, non" quando il modello viene salvato "(se questo è ciò che vuoi, stai cercando la convalida del modello: https://docs.djangoproject.com/en /1.7/ref/models/instances/#validating-objects) ... Che non convaliderà ancora le istanze del modello "ogni volta che la pagina viene caricata", ma perché si desidera comunque una "caratteristica" del genere? –

+0

hmm..no che ci penso, tutte le mie modifiche al modello avvengono solo tramite l'admin attraverso il modulo .. quindi un controllo di validazione ci dovrebbe essere sufficiente..grazie .. – Amistad

Problemi correlati