====== Django Views ======
Devolver el resultado de una función como vista:
# En urls:
urlpatterns = [
path('videos/', views.VideoListView.as_view(), name='videos'),
]
# En views:
from django.http import HttpResponse
def index(request):
return HttpResponse('Hey yo!')
===== 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.
path('profile/', views.UserDetailView.as_view(), name='profile')
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)
:?: 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:
return get_object_or_404(get_user_model(), username=self.kwargs.get('username', ''))
Si los datos viniesen por query string:
username = self.request.GET.get('username', '')
Coger la url con la que fue llamada la view:
request.build_absolute_uri()
=== Set login_required decorator ===
En el urls.py:
login_required(ViewSpaceIndex.as_view(..))
Usando LoginRequiredMixin:
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
Con el method_decorator:
from django.utils.decorators import method_decorator
@method_decorator(login_required, name='dispatch')
class ViewSpaceIndex(TemplateView):
template_name = 'secret.html'
=== Other decorators for user control ===
from django.contrib.auth.decorators import user_passes_test
@user_passes_test(lambda u: u.is_superuser)
def my_view(request):
...
from django.contrib.admin.views.decorators import staff_member_required
@staff_member_required
def my_view(request):
...