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.
6 Réponses :
Vous voudrez faire cela, je pense, dans une vue em> pas dans le modèle em>. Donc, quelque chose comme: Vous pouvez également utiliser un @Decorator code> pour la vue si vous avez trouvé vous-même besoin de le faire beaucoup. P> p>
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.
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 . P>
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 ....
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 %}
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 %}
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. P>