On 8/14/07, Pigletto <[EMAIL PROTECTED]> wrote:
>
> > Out of interest, where do you find newforms to be inflexible? Are you
> > referring to the form_for_* convenience functions or the bulk of
> > newforms itself?
> I also found some 'inflexible' places.
>
> I had a lot of work with form_for_* methods.
> While using form_for_* methods there is only one place you
> can customize your fields/widgets: formfield_callback. I think it is
> not enough.
>
> In my case there were a lot of ForeignKey fields and I had to filter
> their queryset and change value displayed in <select> element.
> It was hard to do it. Also I didn't know where should I set that
> fields are required (I couldn't set null=True in model).
>
> Because of this I've written my own 'my_form_for_*' methods with
> additional callbacks.
> For example: callback that is called just before 'formfield' call
> (before oldform's field is changed into newform's field).
> This callback made changing queryset, required, widget class very
> easy, but it was not easy to
> write (or rather realize how this works) this stuff.
If you wanted to use the standard form_for_* functions, that sounds
like something you could solve by creating a BaseForm which overrides
__init__ (taking any extra arguments you require,.e.g. querysets which
specify data to be used to populate a field's choices), and modifies
the form's fields after the call to super(...).__init__, passing this
BaseForm into form_for_* functions using their "form" argument.
For example, I have a Job model in my application - when creating a
Job, you can either specify a reference number manually (in which case
it must be validated that no Job already has that number) or leave the
number blank to have it auto-populated with the next free reference
number.
As the number absolutely *must* be a required field, I also had a case
where I didn't want to put null=True on the field just for the sake of
a form, so I did this:
# forms/jobs.py:
from django import newforms as form
from officeaid.models import Job
class JobBaseForm(forms.BaseForm):
def __init__(self, *args, **kwargs):
super(JobBaseForm, self).__init__(*args, **kwargs)
self.fields['number'].required = False
def clean_number(self):
if 'number' in self.cleaned_data:
try:
Job.objects.get(number=self.cleaned_data['number'])
raise forms.ValidationError(u'This number is already in use.')
except Job.DoesNotExist:
pass
return self.cleaned_data['number']
# views/jobs.py:
from django import newforms as form
from officeaid.forms.jobs import JobBaseForm
from officeaid.models import Job
AddJobForm = forms.form_for_model(Job,
fields=('name', 'number', ...), form=JobBaseForm)
Jonathan.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---