当前位置: 首页 > 知识库问答 >
问题:

如何在Django中正确地将参数传递给基于类的视图实例?

翟嘉志
2023-03-14

我试图在一个基于类的视图实例中传递参数,但我无法找到正确的方法。

我的api服务在REST框架视图中工作良好,并接收两个强制参数(用户和语言):

我找到了类似的答案,但发送参数作为回报,那不是我的情况。这是我的决定,

_customdictionary = CustomDictionaryViewSet()
_customdictionary.custom_dictionary_kpi(request) 
_customdictionary.custom_dictionary_kpi(request)
_customdictionary.custom_dictionary_kpi({'language': 1, 'user': 1})
_customdictionary.custom_dictionary_kpi(1,1)
# In all cases i receive status = 500
class CustomDictionaryViewSet(viewsets.ModelViewSet):
...
    def custom_dictionary_kpi(self, request, *args, **kwargs):
        try:
            import pdb;pdb.set_trace()
AttributeError: 'WSGIRequest' object has no attribute 'data'

AttributeError: 'dict' object has no attribute 'data'

只发送值:

AttributeError: 'int' object has no attribute 'data'

api/urls.py

urlpatterns = [
url(r'^api/customdictionary/custom_dictionary_kpi/user/<int:user_id>/language/<int:language_id>', CustomDictionaryViewSet.as_view({'post': 'custom_dictionary_kpi'}), name='custom_dictionary_kpi')
]

API/API.PY

class CustomDictionaryViewSet(viewsets.ModelViewSet):
    queryset = CustomDictionary.objects.filter(
        is_active=True,
        is_deleted=False
    ).order_by('id')
    permission_classes = [
        permissions.AllowAny
    ]
    pagination_class = StandardResultsSetPagination

    def __init__(self,*args, **kwargs):
        self.response_data = {'error': [], 'data': {}}
        self.code = 0

    def get_serializer_class(self):
        if self.action == 'custom_dictionary_kpi':
            return CustomDictionaryKpiSerializer
        return CustomDictionarySerializer

    @action(methods=['post'], detail=False)
    def custom_dictionary_kpi(self, request, *args, **kwargs):
        try:
            '''some logic'''
        except Exception as e:
            '''some exception'''
        return Response(self.response_data,status=self.code)

class CustomDictionarySerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomDictionary
        fields = ('__all__')

class CustomDictionaryKpiSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomDictionary
        fields = ('user','language')
class CustomDictionaryView(View):
    """docstring for CustomDictionaryView"""
    def __init__(self,*args, **kwargs):
        self.response_data = {'error': [], 'data': {}}
        self.code = 0

    def get(self, request, *args, **kwargs):
        try:
            _customdictionary = CustomDictionaryViewSet()
            import pdb;pdb.set_trace()
            _customdictionary.custom_dictionary_kpi()   # Here is the call, 
            self.response_data['data'] = _customdictionary.response_data['data']
            self.code = _customdictionary.code

        except Exception as e:
            '''some exception'''

额外的:我如何发送一个额外的可选参数?

非常感谢,如有任何帮助,我们将不胜感激:)

共有1个答案

咸琪
2023-03-14

是的,这是正确的数据,您必须在custom_dictionary_kpi中调用request.data,并且您没有给出作为webrequest的参数。

您可以随时从浏览器、邮递员或客户端发送请求中的可选数据,如{“language”:1,“user”:1,“foo”:“bar”}

并在服务器端执行request.post.get('foo')

如果希望在类中传递数据,可以使用关键字参数这样做

_customdictionary = CustomDictionaryViewSet()
_customdictionary.custom_dictionary_kpi(request,language=1,user=1) 

在方法实现中,您可以在args中访问,例如(request)在这里作为元组访问,如果您将kwargs作为字典访问,例如{“language”:1,“user”:1}在这里作为字典访问

尝试打印或调试args和kwargs,请参阅。

 类似资料:
  • 问题内容: 我有一个基于类的自定义视图 我想像这样传递slug参数(或其他参数到视图) 我是否需要重写任何方法才能做到这一点? 问题答案: 传递给该方法的每个参数都是View类的实例变量。这意味着要添加作为参数,您必须在子类中将其创建为实例变量: 那应该起作用。 如果您通过关键字传递变量,请使用Erikkson先生建议的内容: 如果您的urlconf看起来像这样: 那么该子弹将在您的视图函数(例如

  • 问题内容: 我有一个基于类的自定义视图 我想像这样传递slug参数(或其他参数到视图) 我是否需要重写任何方法才能做到这一点? 问题答案: 传递给该方法的每个参数都是View类的实例变量。这意味着要添加作为参数,你必须在子类中将其创建为实例变量: 那应该起作用。

  • 问题内容: 在我的RCP应用程序中,左侧有一个用于导航的视图,右侧有一个用于视图的文件夹。透视图看起来像这样: 我想根据用户在导航树中选择的内容打开不同的视图。认为这并不难。我的导航树视图: 这似乎很好。仅有一个小问题:我需要以某种方式将对象(例如,selectedItem)传递给我的视图,以使用户与其内容进行交互。我怎么做? 我看到了一些示例,其中一些同事编写了自己的视图,并将其放置在右侧。然后

  • Django 框架中推荐使用一个单独的 python 模块配置 URL 和视图函数或者视图类的映射关系,通常称这个配置模块为 URLconf,该 Python 模块通常命名为 urls.py。一般而言,每个应用目录下都会有一个 urls.py 文件,总的映射关系入口在项目目录下的 urls.py 中,而这个位置又是在 settings.py 文件中指定的。 本小节中将会学习 Django 中的路由

  • [编辑:url中的“<”已被删除,只是它不被视为标记,因此未显示] views.py test.py

  • 在模板中,我有一些这样的代码: 这是“脚本”部分: 我想为选定的学生添加一些新课程,为了做到这一点,我创建了获取课程ID号和课程分数的表单。首先,当我填写表单时,当我点击“添加”按钮时,javascript创建表格,我可以添加许多课程,然后当我应该提交它以在视图部分执行其他步骤并将所有课程保存在数据库中时。我有一些问题,如果有人帮助我,我很高兴。 1)如何将“stock”数组(javaScript