2016-05-10 18 views
3

hinzufügen Ich möchte den Benutzer Anmeldeformular in Django/Mezzanin anpassen nur bestimmte E-Mail-Adressen zu ermöglichen, so habe ich versucht, Affen-Patch wie folgt:Validierung Django Benutzer Form

# Monkey-patch Mezzanine's user email address check to allow only 
# email addresses at @example.com. 
from django.forms import ValidationError 
from django.utils.translation import ugettext 
from mezzanine.accounts.forms import ProfileForm 
from copy import deepcopy 
original_clean_email = deepcopy(ProfileForm.clean_email) 
def clean_email(self): 
    email = self.cleaned_data.get("email") 
    if not email.endswith('@example.com'): 
     raise ValidationError(
      ugettext("Please enter a valid example.com email address")) 
    return original_clean_email(self) 
ProfileForm.clean_email = clean_email 

Diese Code wird an der Spitze eines meiner models.py hinzugefügt.

Allerdings, wenn ich Runserver erhalte ich die

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

gefürchtete Wenn ich

import django 
django.setup() 

fügen Sie dann python manage.py runserver hängt nur, bis ich ^C.

Was soll ich tun, um diese Funktionalität hinzuzufügen?

+0

Aus Interesse, warum haben Sie gedacht, dass das Hinzufügen von 'django.setup()' eine mögliche Lösung war? Es ist dafür gedacht, wenn du Django in Standalone-Skripten verwendest, solltest du es niemals in deinem 'models.py' verwenden. – Alasdair

+1

Das weiß ich jetzt! Ich habe es in Standalone-Skripten verwendet, um die benötigten Modelle einzurichten, und habe nicht erkannt, dass es in einem tatsächlichen Django-Projekt nicht funktionieren würde. – xnx

Antwort

2

Erstellen Sie eine Datei myapp/apps.py für eine Ihrer Apps (Ich habe Nutzung myapp hier) und eine App Config-Klasse definieren, die die monkeypatching im ready() Verfahren der Fall ist.

from django.apps import AppConfig 

class MyAppConfig(AppConfig): 
    name = 'myapp' 

    def ready(self): 
     # do the imports and define clean_email here 
     ProfileForm.clean_email = clean_email 

Dann 'myapp.apps.MyAppConfig' anstelle von 'myapp' in Ihrer INSTALLED_APPS Einstellung.

Sie müssen Mezzanine möglicherweise über die App-Konfiguration setzen, damit es funktioniert.

+0

Danke, Alasdair. Ich fand, dass ich 'Name =' myapp'' zur 'MyAppConfig' Klassendefinition hinzufügen musste. Können Sie in Ihrer Antwort einen Link zu der relevanten Django-Dokumentation oder dem entsprechenden Tutorial bereitstellen? Es scheint nicht einfach zu finden. – xnx

+0

Ich bin mir nicht sicher, wo ich am besten verlinken kann. Möglicherweise finden Sie die Dokumente für [django apps] (https://docs.djangoproject.com/en/1.9/ref/applications/#configuring-applications) hilfreich. Insbesondere ist die Methode "ready" (https://docs.djangoproject.com/en/1.9/ref/applications/#django.apps.AppConfig.ready) der geeignete Ort, um Signale zu registrieren, und in Ihrem Fall Führen Sie das erforderliche Monkeypatching durch. – Alasdair

+0

Ich habe nicht bemerkt, dass 'Name' erforderlich war, ich habe die Antwort aktualisiert. – Alasdair