Как вызвать функцию внутри представления класса в django
У меня есть функция, которая возвращает некоторую информацию об устройстве пользователя, и у меня есть один класс для отображения html и form_class как я могу использовать функцию в классе
?вот мой views.py :
from django.http import request
from django.shortcuts import render, redirect
from .forms import CustomUserCreationForm
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views import generic
def a(request):
device= request.META['HTTP_USER_AGENT']
return device
class RegisterView(generic.CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy("register")
template_name = "man/man.html"
вот мой urls.py :
from django.urls import path
from . import views
urlpatterns = [
path('',views.RegisterView.as_view(), name="register"),
]
class RegisterView(generic.CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy("register")
template_name = "man/man.html"
def form_valid(self, form):
self.object = form.save()
def a(request):
pass
# remember the import: from django.http import HttpResponseRedirect
return HttpResponseRedirect(self.get_success_url())
я делаю это, но не работает
def a(request):
device= request.META['HTTP_USER_AGENT']
print(device)
return device
class RegisterView(generic.CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy("register")
template_name = "man/man.html"
def form_valid(self, form):
self.object = form.save()
def a(request):
pass
return HttpResponseRedirect(self.get_success_url())
Вы можете встроить функцию в свой класс CBV, согласно ответу Мухаммада Шезада.
Если функция достаточно длинная и достаточно общая, чтобы использоваться в нескольких представлениях, вы можете просто вызвать ее из подклассифицированного метода CBV:
from wherever import get_device_info # it needs a much better name than 'a'
class RegisterView( generic.CreateView):
...
def form_valid( self, form):
device_info = get_device_info( self.request)
...
Третий подход, если вы хотите всегда использовать его одним и тем же способом в подклассифицированном методе, заключается в том, чтобы превратить его в класс Mixin. Например
class GetDeviceMixin( object):
def setup(self, request, *args, **kwargs):
super().setup( request, *args, **kwargs)
# do stuff to get the device information
self.device_info = whatever
# all subsequent method invocations will have self.device_info set
class RegisterView( GetDeviceMixin, generic.CreateView):
...