【问题标题】:how can call function inside class view in django如何在 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"),


]

【问题讨论】:

    标签: python django django-models django-views django-forms


    【解决方案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):
        ...
    

    【讨论】:

    • 谢谢你的工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多