Changeset 6839
- Timestamp:
- 12/02/07 12:22:36 (9 months ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/newforms-admin/django/newforms/models.py
r6777 r6839 16 16 __all__ = ( 17 17 'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields', 18 'formset_for_model', ' formset_for_queryset', 'inline_formset',18 'formset_for_model', 'inline_formset', 19 19 'ModelChoiceField', 'ModelMultipleChoiceField', 20 20 ) … … 279 279 queryset = None 280 280 281 def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None):281 def __init__(self, qs, data=None, files=None, auto_id='id_%s', prefix=None): 282 282 kwargs = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix} 283 if self.queryset:284 kwargs['initial'] = [initial_data(obj) for obj in self.get_queryset()]283 self.queryset = qs 284 kwargs['initial'] = [initial_data(obj) for obj in qs] 285 285 super(BaseModelFormSet, self).__init__(**kwargs) 286 287 def get_queryset(self):288 return self.queryset._clone()289 286 290 287 def save_new(self, form, commit=True): … … 307 304 # Put the objects from self.get_queryset into a dict so they are easy to lookup by pk 308 305 existing_objects = {} 309 for obj in self. get_queryset():306 for obj in self.queryset: 310 307 existing_objects[obj._get_pk_val()] = obj 311 308 saved_instances = [] … … 337 334 super(BaseModelFormSet, self).add_fields(form, index) 338 335 339 def formset_for_queryset(queryset, form=BaseForm, formfield_callback=lambda f: f.formfield(),340 formset=BaseModelFormSet, extra=1, orderable=False, deletable=False, fields=None):341 """342 Returns a FormSet class for the given QuerySet. This FormSet will contain343 change forms for every instance in the QuerySet as well as the number of344 add forms specified by ``extra``.345 346 Provide ``extra`` to determine the number of add forms to display.347 348 Provide ``deletable`` if you want to allow the formset to delete any349 objects in the given queryset.350 351 Provide ``form`` if you want to use a custom BaseForm subclass.352 353 Provide ``formfield_callback`` if you want to define different logic for354 determining the formfield for a given database field. It's a callable that355 takes a database Field instance and returns a form Field instance.356 357 Provide ``formset`` if you want to use a custom BaseModelFormSet subclass.358 """359 form = form_for_model(queryset.model, form=form, fields=fields, formfield_callback=formfield_callback)360 FormSet = formset_for_form(form, formset, extra, orderable, deletable)361 FormSet.model = queryset.model362 FormSet.queryset = queryset363 return FormSet364 365 336 def formset_for_model(model, form=BaseForm, formfield_callback=lambda f: f.formfield(), 366 337 formset=BaseModelFormSet, extra=1, orderable=False, deletable=False, fields=None): … … 373 344 uses the model's default manager to determine the queryset. 374 345 """ 375 qs = model._default_manager.all() 376 return formset_for_queryset(qs, form, formfield_callback, formset, extra, orderable, deletable, fields) 346 form = form_for_model(model, form=form, fields=fields, formfield_callback=formfield_callback) 347 FormSet = formset_for_form(form, formset, extra, orderable, deletable) 348 FormSet.model = model 349 return FormSet 377 350 378 351 class InlineFormset(BaseModelFormSet): … … 383 356 # is there a better way to get the object descriptor? 384 357 self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name() 385 super(InlineFormset, self).__init__(data, files, prefix=self.rel_name) 358 qs = self.get_queryset() 359 super(InlineFormset, self).__init__(qs, data, files, prefix=self.rel_name) 386 360 387 361 def get_queryset(self): … … 391 365 """ 392 366 kwargs = {self.fk.name: self.instance} 393 return self. queryset.filter(**kwargs)367 return self.model._default_manager.filter(**kwargs) 394 368 395 369 def save_new(self, form, commit=True): 396 kwargs = {self.fk.get_attname(): self.instance. _get_pk_val()}370 kwargs = {self.fk.get_attname(): self.instance.pk} 397 371 new_obj = self.model(**kwargs) 398 372 return save_instance(form, new_obj, commit=commit) django/branches/newforms-admin/tests/modeltests/model_formsets/models.py
r6655 r6839 17 17 __test__ = {'API_TESTS': """ 18 18 19 >>> from django.newforms.models import formset_for_ queryset, formset_for_model19 >>> from django.newforms.models import formset_for_model 20 20 21 21 >>> qs = Author.objects.all() 22 22 >>> AuthorFormSet = formset_for_model(Author, extra=3) 23 23 24 >>> formset = AuthorFormSet( )24 >>> formset = AuthorFormSet(qs) 25 25 >>> for form in formset.forms: 26 26 ... print form.as_p() … … 36 36 ... } 37 37 38 >>> formset = AuthorFormSet( data=data)38 >>> formset = AuthorFormSet(qs, data=data) 39 39 >>> formset.is_valid() 40 40 True … … 55 55 56 56 >>> qs = Author.objects.order_by('name') 57 >>> AuthorFormSet = formset_for_ queryset(qs, extra=1, deletable=False)58 59 >>> formset = AuthorFormSet( )57 >>> AuthorFormSet = formset_for_model(Author, extra=1, deletable=False) 58 59 >>> formset = AuthorFormSet(qs) 60 60 >>> for form in formset.forms: 61 61 ... print form.as_p() … … 74 74 ... } 75 75 76 >>> formset = AuthorFormSet( data=data)76 >>> formset = AuthorFormSet(qs, data=data) 77 77 >>> formset.is_valid() 78 78 True … … 92 92 93 93 >>> qs = Author.objects.order_by('name') 94 >>> AuthorFormSet = formset_for_ queryset(qs, extra=1, deletable=True)95 96 >>> formset = AuthorFormSet( )94 >>> AuthorFormSet = formset_for_model(Author, extra=1, deletable=True) 95 96 >>> formset = AuthorFormSet(qs) 97 97 >>> for form in formset.forms: 98 98 ... print form.as_p() … … 118 118 ... } 119 119 120 >>> formset = AuthorFormSet( data=data)120 >>> formset = AuthorFormSet(qs, data=data) 121 121 >>> formset.is_valid() 122 122 True
