python - Run all the code in a Django ModelForm __init__() method after an invalid form submission -


based on model:

class booking(models.model):     """     model booking foreign key models session , bundle.     """     session = models.foreignkey(verbose_name=_('session'), to=session, default=none, null=false, blank=false)     bundle = models.foreignkey(verbose_name=_('bundle'), to=bundle, default=none, null=true, blank=true)     price = models.decimalfield(verbose_name=_('price'), max_digits=10, decimal_places=2,                                 default=none, null=false, blank=false)     name = models.charfield(verbose_name=_('name'), max_length=100, default=none, null=false, blank=false)     email = models.emailfield(verbose_name=_('email'), null=true, blank=true)     phone_number = models.charfield(verbose_name=_('phone number'), max_length=30, null=true, blank=true)      def __str__(self):         return "%s @%s" % (self.name, self.bundle if self.bundle else self.session) 

i have following modelform:

class bookingform(forms.modelform):     name = forms.charfield(max_length=100, required=true)      class meta:         model = booking         fields = ['session','bundle', 'name', 'email', 'phone_number']         widgets = {             'bundle': forms.radioselect,             'session': forms.hiddeninput,         }      def __init__(self, *args, **kwargs):         session_pk = kwargs.pop('session', false)         super(bookingform, self).__init__(*args, **kwargs)          if session_pk not false:             session = session.objects.filter(pk=session_pk).first()             if session:                 self.fields['session'].initial = session             if not session or not session.is_bookable:                 raise exception("session not available")             elif session.bundles:                 self.fields['bundle'].widget.attrs['choices'] = session.bundles                 self.fields['bundle'].initial = session.bundles[0] if len(session.bundles) == 1 else none                 self.fields['bundle'].empty_label = none             else:                 del self.fields['bundle'] 

using class-based createview:

class bookingcreateview(generic.createview):     template_name = 'events/booking_form.html'     form_class = bookingform       def get_form_kwargs(self):         """         extended method can pass in session object's pk.          """         kwargs = super(bookingcreateview, self).get_form_kwargs()          if self.request.method == 'get':             session_kwarg = {                 'session': self.kwargs.get('pk', none),             }             kwargs.update(session_kwarg)         return kwargs 

i want bundle field displayed if session field has associated bundles, code shows. works when first render template. if post form invalid fields, bundle field rendered along other fields.

question: how can make logic inside init() executed after form has been submitted incorrectly? preferentially without having recur javascript.

so i've figured out how solve problem:

in modelform changed signature of __init__ method pass in session value outside of kwargs:

def __init__(self, session=none, *args, **kwargs):     session_pk = session     super(bookingform, self).__init__(*args, **kwargs) 

and then, in createview method get_form_kwargs(self), checking condition:

if self.request.method == 'get' 

it happened wasn't passing session in form's kwargs when request.method == 'post'. problem solved!


Comments

Popular posts from this blog

How to understand 2 main() functions after using uftrace to profile the C++ program? -

c# - Update a combobox from a presenter (MVP) -

How to put a lock and transaction on table using spring 4 or above using jdbcTemplate and annotations like @Transactional? -