如何在 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 的类视图中调用函数的主要内容,如果未能解决你的问题,请参考以下文章