Как вызвать функцию внутри представления класса в 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):
    ...
Вернуться на верх