Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
|
wiki2:python:django:views [2018/10/11 19:39] alfred creado |
wiki2:python:django:views [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 12: | Línea 12: | ||
| def index(request): | def index(request): | ||
| return HttpResponse('Hey yo!') | return HttpResponse('Hey yo!') | ||
| + | </code> | ||
| + | |||
| + | |||
| + | ===== How to... ===== | ||
| + | ==== Get data from url ==== | ||
| + | |||
| + | === En generic views === | ||
| + | If you don't want to pass a pk or slug in your url, you'll need to override the ''get_object'' method and get your object another way. | ||
| + | <code> | ||
| + | path('profile/<username>', views.UserDetailView.as_view(), name='profile') | ||
| + | </code> | ||
| + | |||
| + | <code> | ||
| + | class UserDetailView(generic.DetailView): | ||
| + | model = apps.get_model('openawards', 'User') | ||
| + | username = '' | ||
| + | |||
| + | def dispatch(self, request, *args, **kwargs): | ||
| + | super().dispatch(request, *args, **kwargs) | ||
| + | self.username = kwargs.get('username', '') | ||
| + | |||
| + | def get_object(self): | ||
| + | return get_object_or_404(get_user_model(), username=self.username) | ||
| + | </code> | ||
| + | |||
| + | :?: Me pregunto si hay otra forma mejor de sacar el parámetro de la url en vez de sobreescribiendo el dispatch. Si!! Siempre puedes acceder a los kwargs de la request: | ||
| + | <code> | ||
| + | return get_object_or_404(get_user_model(), username=self.kwargs.get('username', '')) | ||
| + | </code> | ||
| + | |||
| + | Si los datos viniesen por query string: | ||
| + | <code> | ||
| + | username = self.request.GET.get('username', '') | ||
| + | </code> | ||
| + | |||
| + | Coger la url con la que fue llamada la view: | ||
| + | <code> | ||
| + | request.build_absolute_uri() | ||
| + | </code> | ||
| + | |||
| + | === Set login_required decorator === | ||
| + | En el urls.py: | ||
| + | <code> | ||
| + | login_required(ViewSpaceIndex.as_view(..)) | ||
| + | </code> | ||
| + | Usando LoginRequiredMixin: | ||
| + | <code> | ||
| + | from django.contrib.auth.mixins import LoginRequiredMixin | ||
| + | class MyView(LoginRequiredMixin, View): | ||
| + | login_url = '/login/' | ||
| + | redirect_field_name = 'redirect_to' | ||
| + | </code> | ||
| + | Con el method_decorator: | ||
| + | <code> | ||
| + | from django.utils.decorators import method_decorator | ||
| + | @method_decorator(login_required, name='dispatch') | ||
| + | class ViewSpaceIndex(TemplateView): | ||
| + | template_name = 'secret.html' | ||
| + | </code> | ||
| + | |||
| + | === Other decorators for user control === | ||
| + | <code> | ||
| + | from django.contrib.auth.decorators import user_passes_test | ||
| + | |||
| + | @user_passes_test(lambda u: u.is_superuser) | ||
| + | def my_view(request): | ||
| + | ... | ||
| + | </code> | ||
| + | |||
| + | <code> | ||
| + | from django.contrib.admin.views.decorators import staff_member_required | ||
| + | |||
| + | @staff_member_required | ||
| + | def my_view(request): | ||
| + | ... | ||
| </code> | </code> | ||