【问题标题】:Converting Function Based View to class Based View将基于函数的视图转换为基于类的视图
【发布时间】:2023-03-06 15:53:02
【问题描述】:

我想为带有 JSon 响应的 CreateView 实现引导模式。我之前已经用基于函数的视图做过类似的事情。但是,当我尝试使用基于类的视图 (CBV) 时,会遇到很多错误。在我解决了一个错误后,我得到了另一个错误。我什至不知道现在出了什么问题,因为当前的错误并不能真正解释。

forms.py:


class CategoryForm(ModelForm):
    category_name = forms.CharField(max_length=70)    

    class Meta:
        model = Category
        fields = ['category_name']           

    def __init__(self, user, *args, **kwargs):        
        super(CategoryForm, self).__init__(*args, **kwargs)   

views.py

class CategoryCreateView(LoginRequiredMixin, CreateView):
    form_class = CategoryForm    
    data = dict() 

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        #context = super().get_context_data(**kwargs)
        #context['form'] = form_class
        context = {'form': form_class}
        return context

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.save(commit=True)
        data['form_is_valid'] = True        
        data['html_form'] = render_to_string('partial_category_create.html',
            super().get_context_data(),
            request=self.request
        ) 

        return JsonResponse(data)  

    def form_invalid(self, form):
        data['form_is_valid'] = False
        data['html_form'] = render_to_string('partial_category_create.html',
            super().get_context_data(),
            request=self.request
        ) 

    def post(self, request):
        form = CategoryForm(data=request.POST, user=request.user)        

    def get(self, request):
        form = CategoryForm(request.user)            
        data['html_form'] = render_to_string('partial_category_create.html',
            super().get_context_data(),
            request=self.request
        )

下面的代码基本上就是我想在基于类的视图中实现的功能

@login_required
def category_create(request):
    data = dict()

    if request.method == 'POST':
        form = CategoryForm(data=request.POST, user=request.user)
        if form.is_valid():
            form.instance.user = request.user
            #print(form.cleaned_data)
            form.save(commit=True)            
            data['form_is_valid'] = True
        else:
            data['form_is_valid'] = False
    else:
        form = CategoryForm(request.user)

    context = {'form': form}
    data['html_form'] = render_to_string('partial_category_create.html',
        context,
        request=request
    )
    return JsonResponse(data)

错误:

Internal Server Error: /tasks/category/create/
Traceback (most recent call last):
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\contrib\auth\mixins.py", line 52, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\User\django\todolist\tasks\views.py", line 61, in get
    super().get_context_data(),
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\views\generic\edit.py", line 66, in get_context_data
    kwargs['form'] = self.get_form()
  File "C:\Users\User\.virtualenvs\toDoList-xn6KQcJg\lib\site-packages\django\views\generic\edit.py", line 33, in get_form
    return form_class(**self.get_form_kwargs())
TypeError: __init__() missing 1 required positional argument: 'user'
[25/Feb/2020 20:47:34] "GET /tasks/category/create/ HTTP/1.1" 500 21020

views.py 的第 61 行,在方法 get 中是该行 super().get_context_data(),

我想要做的是提供上下文。请检查基于函数的视图以获取等效项

【问题讨论】:

  • 你能发布完整的异常跟踪日志吗?
  • @Charnel,我已经提供了完整的异常跟踪

标签: python json django django-views


【解决方案1】:

在您的视图中覆盖此方法:

def get_form_kwargs(self):
    kwargs = super(MyCreateView, self).get_form_kwargs()
    kwargs.update({'user': self.request.user})
    return kwargs

并使用proper signature - 而不是这个:

super().get_context_data()

使用这个:

super().get_context_data(**kwargs)

另外,你为什么要重新定义get_context_data也不是很明显

【讨论】:

  • 感谢@Charnel.. 当我实现get_form_kwargs 方法时,它清除了错误,但是当我在get() 方法中调用super().get_context_data(**kwargs) 方法时,它给出了一个错误kwargs没有定义。当我从函数调用中删除 **kwargs 时,它给出了另一个错误 `AttributeError: 'CategoryCreateView' object has no attribute 'object'
【解决方案2】:

get下,改:

form = CategoryForm(request.user) 

收件人:

form = CategoryForm(data=None, user=request.user)

如果不是,请提供异常跟踪。

【讨论】:

  • 我已经提供了完整的异常跟踪
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2014-08-07
  • 2014-02-16
相关资源
最近更新 更多