The form.is_valid () function does not work in Django

1

I hope you can help me in advance thank you very much, it turns out that I have a form that I need to fill with information from my database before sending it to the template, but it turns out that when I want to evaluate it using the POST method, when validating it with if form.is_valid (): it returns me a False and I do not know why, as I could solve it, then my code.

class CheckboxForm(forms.Form):
    check_0 = forms.BooleanField(label="", required=False)
    check_1 = forms.BooleanField(label="", required=False)
    check_2 = forms.BooleanField(label="", required=False)
    check_3 = forms.BooleanField(label="", required=False)
    check_4 = forms.BooleanField(label="", required=False)
    check_5 = forms.BooleanField(label="", required=False)
    check_6 = forms.BooleanField(label="", required=False)
    check_7 = forms.BooleanField(label="", required=False)
    check_8 = forms.BooleanField(label="", required=False)
    check_9 = forms.BooleanField(label="", required=False)
    check_10 = forms.BooleanField(label="", required=False)
    check_11 = forms.BooleanField(label="", required=False)
    check_12 = forms.BooleanField(label="", required=False)
    check_13 = forms.BooleanField(label="", required=False)
    check_14 = forms.BooleanField(label="", required=False)

    def __init__(self, school=None, *args, **kwargs):
        super(CheckboxForm, self).__init__(*args, **kwargs)
        if school:
            print("entro")
            values = InstitucionalValues.objects.all()
            i = 0
            for value in values:
                name = "check_" + str(i)
                v_school = value.school.all()
                for v in v_school:
                    if v == school:
                        self.fields[name] = forms.BooleanField(label="", required=False, initial=True)
                        break
                i = i + 1

And the post method:

class VistaFormulario(View):
    def post(self, request):
       form = CheckboxForm(request.POST)
       if form.is_valid():
    
asked by Hugo 21.07.2017 в 22:36
source

1 answer

1

A very simple example of how to do it with Class using FormView

My ModelForm

from django import forms

class PostsForms(forms.ModelForm):

    titulo = forms.CharField(max_length=240, min_length=8, required=True,
                             widget=forms.TextInput(attrs={
                                 'class': 'form-control',
                                 'name': 'titulo', 'id': 'titulo', 'placeholder': 'Escribe un titulo'}))
    cuerpo = forms.CharField(required=True,
                             widget=forms.Textarea(attrs={
                                 'class': 'form-control',
                                 'name': 'cuerpo',
                                 'id': 'cuerpo',
                                 'placeholder': 'Contenido del posts'}))
    categoria = forms.Select(attrs={'class': 'form-control'})
    tags = forms.CharField(max_length=240, min_length=10, required=True,
                           widget=forms.TextInput(attrs={'class': 'form-control',
                                 'placeholder': 'Etiquetas separadas por comas (,)', 'id': 'tags'}))
    img_file = forms.CharField(required=True,
                               widget=forms.TextInput(attrs={
                                   'class': 'form-control',
                                   'placeholder': 'Seleccion un archivo',
                                   'id': 'append-big-btn',
                                   'readonly': '',

                               }))
    permitir_comentarios = forms.BooleanField(required=False,
                                              widget=forms.CheckboxInput(
                                                  attrs={}))

    class Meta:
        model = posts
        fields = {'titulo', 'categoria', 'cuerpo', 'tags', 'permitir_comentarios', 'img_file'}
        widgets = {
            'categoria': forms.Select(attrs={'class': 'form-control'})
        }

and my FormView view

class CreatePosts(FormView):
    categoria = categorias.objects.all()
    model = posts
    template_name = "posts/create_form.html"
    form_class = PostsForms

    def get(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(**kwargs)
        context['form'] = form
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        if form.is_valid():
            return self.form_valid(form, **kwargs)
        else:
            return self.form_invalid(form, **kwargs)

    def form_invalid(self, form, **kwargs):
        context = self.get_context_data(**kwargs)
        context['form'] = form

        return self.render_to_response(context)

    def form_valid(self, form, **kwargs):
        context = self.get_context_data(**kwargs)
        context['form'] = form
        add = form.save(commit=False)
        add.user = self.request.user
        add.img_file = self.request.POST['upload_file']
        add.save()
        form.save_m2m()

        haySeguidores = Seguidores.follow_to_user(2, str(add.pk), int(self.request.user.pk) ,1) #Prueba de notificaciones
        for follows in haySeguidores['user_follows']:
            notis = Notificaciones()
            #print(follows.seguidor_id)

            notis.user = follows.seguidor_id
            notis.tipo = 1
            notis.tipo_id = add.pk
            notis.user_for = self.request.user.pk
            notis.type_for = 0
            notis.save()



        redirect_url = reverse('ver-posts', args=[str(add.pk), slugify(self.request.POST['titulo'])])
        return HttpResponseRedirect(redirect_url)

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(CreatePosts, self).dispatch(*args, **kwargs)

I hope it helps you.

    
answered by 21.07.2017 в 22:54