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
Post a Comment