Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django forms: change attribute of formfield dynamically

I have a form like the one below:

class ConsentFormTpl(forms.Form):
    title =  forms.CharField()
    message = forms.CharField(widget=EditorWidget,label='Description')
    acknowledge = forms.BooleanField(label="Require acknowledgement?")
    deadline = forms.DateField(widget=CalendarTimeWidget,label="Acknowledge By")
    start_time = forms.DateTimeField(widget=CalendarTimeWidget)
    end_time = forms.DateTimeField(widget=CalendarTimeWidget)
    availClass  = forms.ModelChoiceField(queryset=SchoolClass.objects.all(),empty_label="Select a class",label='Class')
    consent = forms.BooleanField()
    students = forms.ModelMultipleChoiceField(label="",\
        queryset=User.objects.filter(groups__name='Students').extra(select={'user_name':"first_name || ' ' || last_name"}), \
        widget=FilteredSelectMultiple("Students",is_stacked=False))
    where =  forms.CharField()
    form_name = forms.CharField(label='Save as:')


    def __init__(self,data=None,draft=False):
        super(ConsentFormTpl,self).__init__(data)
        self.draft = draft

        self.acknowledge.required = False
        self.deadline.required = False
        self.start_time.required = False
        self.end_time.required = False
        self.availClass.required = False
        self.consent.required = False
        self.where.required = False

        if draft:
            self.title.required = False
            self.message.required = False
            self.students.required = False
            self.form_name.required = True
        else:
            self.form_name.required = False

Depending on the value of draft, I want to change the attributes (required) of some of the fields, which was what was in the init method.

However I encountered the following message:

'ConsentFormTpl' object has no attribute 'acknowledge'

Anyone knows why?

like image 664
goh Avatar asked May 13 '11 08:05

goh


1 Answers

The fields aren't available as attributes on the form instance. They're available as dictionary elements in self.fields. So:

self.fields['acknowledge'].required = False

and so on.

like image 96
Daniel Roseman Avatar answered Oct 18 '22 21:10

Daniel Roseman