• 13 sierpnia 2024 11:40

    Dane w jednym z pól formularza są widoczne w form.cleaned_data ale nie są widoczne w szablonie.
    Kod który mam jest taki.
    form_fields.py

    from django import forms
    
    # to pole ma zamienic domyslny dla MultipleChoiceField sposob walidacji
    class AbcFormField(forms.MultipleChoiceField):
        def validate(self,value):
            forms.Field.validate(self.value)
    

    forms.py

    from django import forms
    from .form_fields import AbcFormField
    
    class AbcForm(forms.Form):
        abc = AbcFormField(required=False)
    

    views.py

    from django.views.generic import FormView
    from .forms import AbcForm
    
    class AbcView(FormView):
        template_name = <jakis template>
        form_class = AbcForm
    
       def get_context_data(self, **kwargs):
             context = super().get_context_data(**kwargs)
             # tutaj wartosci w context dla form.abc nie pokazuja sie, a powinny
             return context
    
       def form_valid(self, form):
            # tutaj jakis kod
            # wartosc w form.cleaned_data["abc"] jest widoczna i poprawna
            return self.render_to_response(self.get_context_data())
    

    Pola abc w formularzu potrzebuje tylko do walidacji i wyczyszczenia danych, które przychodzą z formularza, ale chciałby te wyczyszczone dane mieć z powrotem dostępne w szablonie do wyświetlenia.

  • 19 sierpnia 2024 23:55

    Problem jest w widoku:

    from django.views.generic import FormView
    from .forms import AbcForm
    
    class AbcView(FormView):
        ...
    
        def form_valid(self, form):
            # poprawiony kod
            return self.render_to_response(self.get_context_data(form=form))
    

    Jeśli nie przekażesz instancji form z którą wywołana została metoda form_valid w argumencie form do self.get_context_data(), to utworzy ona nową instancję formularza która nie będzie wypełniona danymi.

    Logika ta znajduje się w FormMixin:

    class FormMixin(ContextMixin):
        ...
    
        def get_context_data(self, **kwargs):
            """Insert the form into the context dict."""
            if "form" not in kwargs:
                kwargs["form"] = self.get_form()
            return super().get_context_data(**kwargs)
    
  • 20 sierpnia 2024 17:25

    Dzięki, byłem przekonany że to się automatycznie w widoku dzieje.