Вопрос

in my way of perfectionism, I'm here to ask more questions about the not-so-well-documented class-based views.

I spend like 5 hours learning about class-based views, lurking into the code and I got a question.

Maybe what I'm trying to do is stupid, and if so, just say that.

I will put a simple example:

class SearchFormView(FormView):
    template_name = 'search/search.html'
    form_class = SearchForm

    def get(self, request, *args, **kwargs):
        form = SearchForm(self.request.GET or None)
        if form.is_valid():
            self.mystuff = Stuff.objects.filter(title__icontains=form.cleaned_data['query'])[:10]

        return super(SearchFormView, self).get(request, *args, **kwargs)

This is a perfect valid class (it is, right?).

You have a form, and you make a GET request with a query parameter.

Works like a charm.

But lets imagine... I validate the query input to prevent some type of attack and I see that the query is malicious so I put a validation error.

With the old functions, I have a form instance (empty) and I put data in it and validation errors if needed. I always return that instance, if empty (first request) or if it filled with errors (the case of the malicious query).

The problem is with class-based views. In my get method I work with an extra instance of SearchForm so if I put validation stuff would be there and if I call get on the father it will use the instance on "form_class" that would be empty.

So, I think that there should be a way where I use the same form always, I mean: I call the request method, I pick the form_class (not create a new form), pass the data, validate and the father will return that form with the validation stuff.

Im not sure if I explained this correctly. So in short, Im creating a copy of the form in the get but I return the father get who have another copy that will be empty, so my when I display the template, there will be no errors because the form sended is empty.

Any ideas? Thanks.

Нет правильного решения

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top