如何在 django 的类视图中调用函数

Posted

技术标签:

【中文标题】如何在 django 的类视图中调用函数【英文标题】:how can call function inside class view in django 【发布时间】:2022-01-21 23:40:07 【问题描述】:

我有一个函数可以返回一些关于用户设备的信息,我有一个类来显示我的 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']
    print(device)
    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"),


]

【问题讨论】:

【参考方案1】:
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())

【讨论】:

我这样做但不工作 如果它工作,设备必须在cmd中打印 但设备不会在 cmd 中使用此代码打印【参考方案2】:

您可以按照 Muhammad Shezad 的回答将该函数构建到您的 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):
    ...

【讨论】:

谢谢你的工作

以上是关于如何在 django 的类视图中调用函数的主要内容,如果未能解决你的问题,请参考以下文章

Django:如何从模板调用视图函数?

django-基于类的视图

如何在 Django 中设置 AJAX 调用的视图/路径?

如何在 Django 中获取更新的类变量值

我如何从 jQuery Datatables 调用 django 视图?

当前路径具有子目录或 url 参数时,使用 AJAX 调用视图函数不起作用(Django)