2010-12-09 8 views
0

J'essaye de créer un script qui récupérera un compte d'utilisateur et en même temps que les utilisateurs particuliers 'compte' le thème dans une requête simple. Voici le code que je utilise, s'il vous plaît noter la méthode get_account:Django - Utiliser les valeurs par défaut si la requête échoue

class AccountManager(Manager): 
    def __init__(self, *args, **kwargs): 
     super(AccountManager, self).__init__(*args, **kwargs) 

    def get_account(self, slug): 
     return get_object_or_404(self.select_related('theme'), status__exact=self.model.ACTIVE_STATUS, slug__exact=slug) 

Il fonctionne très bien, mais si pour une raison quelconque l'objet « thème » renvoie null (cela ne devrait jamais arriver, mais je veux être sûr!) , il redirigera vers une page 404. Ce que je veux faire, c'est vérifier si l'objet thème existe et est valide, et sinon, par défaut au thème standard et continuer.

Je voudrais toujours que la requête lance un 404 si le compte utilisateur n'est pas valide. À moins d'utiliser une charge de type try/exceptions, y a-t-il une bonne façon de procéder? Je tiens à garder mes gestionnaires agréable et bien rangé quelqu'un :)

Hope peut aider

Répondre

1
try: 
    account = self.select_related('theme').get(
       status__exact=self.model.ACTIVE_STATUS, slug__exact=slug 
      ) 
except self.model.DoesNotExist: 
    account = self.select_related('theme').get(slug="default_slug") 

return account 
+0

Salut, merci pour votre réponse. Peut-être que je n'étais pas clair dans mon message, mais je veux être en mesure de recourir à un défaut lorsque le modèle «thème» DoesNotExist, si le modèle de compte est absent, il va lancer un 404. – Hanpan

0

Dans votre exemple, il ne serait pas le résultat d'une 404 si le thème lié était nul car il est pas l'objet étant récupéré avec get_object_or_404(). Il ne sera que 404 s'il ne peut pas trouver un objet de compte à la fois ACTIVE_STATUS et un slug correspondant.

Ma suggestion pour vous assurer d'utiliser un thème par défaut avec un objet de compte valide est:

class AccountManager(Manager): 
    def __init__(self, *args, **kwargs): 
     super(AccountManager, self).__init__(*args, **kwargs) 

    def get_account(self, slug): 
     account = get_object_or_404(self.select_related('theme'), status__exact=self.model.ACTIVE_STATUS, slug__exact=slug) 
     if not account.theme: 
      account.theme = default_theme_obj 
     return account 

Je vais laisser à vous de déterminer comment vous obtiendriez default_theme_obj que je ne connais pas vos modèles , la structure de mise en cache et autres joyeusetés. Dans l'intérêt de garder vos gestionnaires bien rangés, vous n'avez pas besoin de la méthode __init__, car elle ne fait rien que celle par défaut ne ferait pas.