8
votes

Redirecter un utilisateur dans un modèle Django

J'ai un site Web Django renversé en fonction de quel type d'utilisateur vous êtes, j'ai besoin de rediriger les utilisateurs qui ne sont pas autorisés à voir certains aspects du site,

dans mon modèle, j'ai p> xxx pré>

Comment irai rediriger ledit magasin à l'index du site? p>

==== EDIT ==== P>

Environment:

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',
 'django.contrib.auth.middleware.AuthenticationMiddleware')


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.


0 commentaires

6 Réponses :


24
votes

Vous voudrez faire cela, je pense, dans une vue pas dans le modèle . Donc, quelque chose comme: xxx

Vous pouvez également utiliser un @Decorator pour la vue si vous avez trouvé vous-même besoin de le faire beaucoup.


2 commentaires

Je peux penser à certains cas valides où vous souhaitez que le modèle détermine s'il faut rediriger. La plupart se produisent lorsque l'auteur de modèle dispose d'une logique spécifique à la page qui détermine que vous devez afficher une autre page avant de consulter cette page.


+1 @Gregglockner Pour ajouter un autre cas: lorsque vous remplacez un modèle d'une bibliothèque tierce. Il est plus facile de rediriger dans un modèle dans certains cas que de remplacer la vue parce que vous personnalisez le premier de toute façon.



1
votes

Vous ne feriez pas cela dans le modèle, mais dans la vue. Au lieu d'appeler Render_To_Response (que je présume que vous faites maintenant), vous appelleriez HTTPRESPONSEREDIRECT .


0 commentaires

2
votes

Je pense que vous voudrez peut-être faire la redirection dans le code de vue.

Par exemple, cela fonctionnerait dans Django 1.1. P>

from django.shortcuts import redirect

def my_view(request):
    if request.user.get_profile().is_store:
        return redirect('index')
    # normal view code here
    return ....
  • Un modèle: la fonction GET_ABSOLUTE_URL () du modèle sera appelée. LI>
  • Nom de la vue, éventuellement avec des arguments: urlresolvers.Reverse () sera utilisé pour inverser-résoudre le nom. LI>
  • une URL, qui sera utilisée comme-objet pour l'emplacement de redirection. Li> ul> p>


0 commentaires

5
votes

Vous ne voulez vraiment pas rediriger dans un modèle, comme indiqué dans toutes les autres réponses.

Mais si la redirection dans une vue n'est pas une option (pourquoi jamais), vous pouvez le faire: P>

{% if user.get_profile.is_store %}
    {% include '/path/to/template' %}
{% else %}
    {% include '/path/to/another_template' %}
{% endif %}


0 commentaires

17
votes

Utilisez la redirection brute de HTML.

{% if user.get_profile.is_store %}
    <meta http-equiv="REFRESH" content="0;url={{ user.get_profile.store_url }}">
{% endif %}


0 commentaires

3
votes

Bien sûr, nous avons parfois des points de vue importés du code officiel de Django ou d'autres qui ne dépendent pas de nous. Nous ne pouvons pas placer une redirection dans ces vues, de sorte que le seul moyen est de passer par un modèle que ces vues (intouchables) utilisent.


0 commentaires