2009-11-30 5 views
0

Je peux voir le problème, j'ai joint mon code et la page d'erreur.Django rediriger ne fonctionne pas

Dans mon modèle, j'ai:

{% if user.get_profile.is_store %} 
    <!--DO SOME LOGIC--> 
{%endif%} 

À mon avis, je:

def downloads(request): 
""" 
Downloads page, a user facing page for the trade members to downloads POS etc 
""" 
if not authenticated_user(request): 
     return HttpResponseRedirect("/professional/") 

if request.user.get_profile().is_store(): 
     return HttpResponseRedirect("/") 

user = request.user 
account = user.get_profile() 

downloads_list = TradeDownloads.objects.filter(online=1)[:6] 
downloads_list[0].get_thumbnail() 
data = {} 
data['download_list'] = downloads_list 

return render_to_response('downloads.html', data, RequestContext(request)) 

Environnement:

Request Method: GET 
    Request URL: http://localhost:8000/professional/downloads 
    Django Version: 1.1.1 
    Python Version: 2.6.2 
    Installed Applications: 
    ['django.contrib.auth', 
    'django.contrib.admin', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.sites', 
    'sico.news', 
    'sico.store_locator', 
    'sico.css_switch', 
    'sico.professional', 
    'sico.contact', 
    'sico.shop', 
    'tinymce', 
    'captcha'] 
    Installed Middleware: 
    ('django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 

Mon rapport d'erreur:

Traceback: 
    File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response 
     92.     response = callback(request, *callback_args, **callback_kwargs) 
    File "/var/www/sico/src/sico/../sico/professional/views.py" in downloads 
     78. if request.user.get_profile().is_store(): 
    File "/var/www/sico/src/sico/../sico/shop/models.py" in is_store 
     988.   return not self.account is None 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/fields/related.py" in __get__ 
     191.    rel_obj = self.related.model._base_manager.get(**params) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/manager.py" in get 
     120.   return self.get_query_set().get(*args, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/django/db/models/query.py" in get 
     305.      % self.model._meta.object_name) 

    Exception Type: DoesNotExist at /professional/downloads 
    Exception Value: Account matching query does not exist. 

Mon BaseAccount classe

class BaseAccount(models.Model): 
user = models.ForeignKey(User, unique=True) 

def __unicode__(self): 
    """ 
    Return the unicode representation of this customer, which is the user's 
    full name, if set, otherwise, the user's username 
    """ 
    fn = self.user.get_full_name() 
    if fn: 
     return fn 
    return self.user.username 

def user_name(self): 
    """ 
    Returns the full name of the related user object 
    """ 
    return self.user.get_full_name() 

def email(self): 
    """ 
    Return the email address of the related user object 
    """ 
    return self.user.email 

def is_store(self): 
    return not self.account is None 

def is_professional(self): 
    return not self.professional is None 

Mon compte class`

lass Account(BaseAccount): 
""" 
The account is an extension of the Django user and serves as the profile 
object in user.get_profile() for shop purchases and sessions 
""" 
telephone = models.CharField(max_length=32) 
default_address = models.ForeignKey(Address, related_name='billing_account', blank=True, null=True) 
security_question = models.ForeignKey(SecurityQuestion) 
security_answer = models.CharField(max_length=200) 
how_heard = models.CharField("How did you hear about us?", max_length=100) 
feedback = models.TextField(blank=True) 
opt_in = models.BooleanField("Subscribe to mailing list", help_text="Please tick here if you would like to receive updates from %s" % Site.objects.get_current().name) 
temporary = models.BooleanField() 

def has_placed_orders(self): 
    """ 
    Returns True if the user has placed at least one order, False otherwise 
    """ 
    return self.order_set.count() > 0 

def get_last_order(self): 
    """ 
    Returns the latest order that this customer has placed. If no orders 
    have been placed, then None is returned 
    """ 
    try: 
     return self.order_set.all().order_by('-date')[0] 
    except IndexError: 
     return None 

def get_currency(self): 
    """ 
    Get the currency for this customer. If global currencies are enabled 
    (settings.ENABLE_GLOBAL_CURRENCIES) then this function will return 
    the currency related to their default address, otherwise, it returns 
    the site default 
    """ 
    if settings.ENABLE_GLOBAL_CURRENCIES: 
     return self.default_address.country.currency 
    return Currency.get_default_currency() 
currency = property(get_currency) 

def get_gateway_currency(self): 
    """ 
    Get the currency that an order will be put through protx with. If protx 
    currencies are enabled (settings.ENABLE_PROTX_CURRENCIES), then the 
    currency will be the same returned by get_currency, otherwise, the 
    site default is used 
    """ 
    if settings.ENABLE_PROTX_CURRENCIES and settings.ENABLE_GLOBAL_CURRENCIES: 
     return self.currency 
    return Currency.get_default_currency() 
gateway_currency = property(get_gateway_currency) 

`

+0

Avez-vous à la fois la balise de modèle ({% if ...) et l'affichage des téléchargements dans votre modèle? Veuillez utiliser des blocs de code séparés dans votre question si ces bits sont à des endroits différents, sinon cela semble très confus. –

+0

désolé je ne suis pas, la redirection est dans la vue des téléchargements et est la vérification qui est fait que la page est chargée, je me trompe? – Udders

+0

C'est probablement correct à ce moment-là, mais c'est mieux si vous pouvez séparer le code que vous montrez en différents blocs de code, car cela semble déroutant. –

Répondre

3

self.account pointe vers un objet Account inexistant lorsqu'il essaie de traiter is_store(). Je suppose que vous utilisez une base de données qui n'applique pas les clés étrangères * toux * MySQL * toux *, et vos données ont été gâchées.

0

Il semble que la valeur de retour user.get_profile() est vide, et donc il échoue sur le prochain is_store() appel:

return not self.account is None 

Qui échoue, parce que l'auto est vide (c.-à-d. Aucun). [Edit] Après avoir lu this (sous Profils) il semble que le profil de cet utilisateur n'existe pas et donc vous obtenez l'exception DoesNotExist.

+0

Sauf que la trace de la pile montre que 'DoesNotExist' se dégage de la méthode' is_store() ', pas de la méthode' get_profile() ' – jcdyer

+0

Qu'est-ce que cela signifie? – Udders

+0

@jcd: bon point. Il serait bon que sico87 puisse publier le code de son objet Profil. –

0

Ce n'est pas la redirection qui ne fonctionne pas, c'est votre procédure is_store() ou un profil inexistant. Vous devriez vérifier ce qui se réfère exactement à self.account.
Autant que je sache à partir du code, vous avez deux tables dans votre base de données: une pour le compte baseaccount, qui ne stocke que l'ID utilisateur, et le compte, qui stocke tous les champs associés au compte + baseaccount id. Vous pouvez essayer de remplacer is_store quelque chose comme ça

def is_store(self): 
try: 
    return self.account is None 
except Account.DoesNotExist: 
    return False 

Je ne suis pas un expert Django, mais je pense que cela pourrait faire l'affaire.

+0

Désolé, j'ai hérité de ce code et je suis nouveau à Django, donc j'apprends en faisant, comment voir à quoi se réfère le compte, puis-je faire quelque chose avec ObjectDoesNotExist? – Udders

Questions connexes