Преобразование представления на основе функций в представление на основе классов - PullRequest
0 голосов
/ 25 февраля 2020

Я хочу реализовать модальный bootstrap для CreateView с ответом JSon. Я уже делал нечто похожее на это раньше с функциональными представлениями. Однако, когда я пытаюсь сделать это с помощью Class Based Views (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

Строка 61 из views.py в методе get - это строка super().get_context_data(),

Я пытаюсь создать контекст. Пожалуйста, проверьте функциональный вид на эквивалент

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Переопределите этот метод на ваш взгляд:

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

и используйте правильную подпись - вместо этого:

super().get_context_data()

используйте это:

super().get_context_data(**kwargs)

Кроме того, не очевидно, почему вы переопределены get_context_data

1 голос
/ 26 февраля 2020

Под get, измените:

form = CategoryForm(request.user) 

На:

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

Если это не так, предоставьте трассировку исключения.

...