mirror of
https://github.com/django/django.git
synced 2025-07-04 09:49:12 +00:00
newforms-admin: Removed formset_for_queryset. BaseModelFormSet's constructor now takes a queryset argument instead.
git-svn-id: http://code.djangoproject.com/svn/django/branches/newforms-admin@6839 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
b15703d322
commit
081d0ed889
@ -15,7 +15,7 @@ from widgets import Select, SelectMultiple, HiddenInput, MultipleHiddenInput
|
|||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields',
|
'save_instance', 'form_for_model', 'form_for_instance', 'form_for_fields',
|
||||||
'formset_for_model', 'formset_for_queryset', 'inline_formset',
|
'formset_for_model', 'inline_formset',
|
||||||
'ModelChoiceField', 'ModelMultipleChoiceField',
|
'ModelChoiceField', 'ModelMultipleChoiceField',
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -278,15 +278,12 @@ class BaseModelFormSet(BaseFormSet):
|
|||||||
model = None
|
model = None
|
||||||
queryset = None
|
queryset = None
|
||||||
|
|
||||||
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None):
|
def __init__(self, qs, data=None, files=None, auto_id='id_%s', prefix=None):
|
||||||
kwargs = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix}
|
kwargs = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix}
|
||||||
if self.queryset:
|
self.queryset = qs
|
||||||
kwargs['initial'] = [initial_data(obj) for obj in self.get_queryset()]
|
kwargs['initial'] = [initial_data(obj) for obj in qs]
|
||||||
super(BaseModelFormSet, self).__init__(**kwargs)
|
super(BaseModelFormSet, self).__init__(**kwargs)
|
||||||
|
|
||||||
def get_queryset(self):
|
|
||||||
return self.queryset._clone()
|
|
||||||
|
|
||||||
def save_new(self, form, commit=True):
|
def save_new(self, form, commit=True):
|
||||||
"""Saves and returns a new model instance for the given form."""
|
"""Saves and returns a new model instance for the given form."""
|
||||||
return save_instance(form, self.model(), commit=commit)
|
return save_instance(form, self.model(), commit=commit)
|
||||||
@ -306,7 +303,7 @@ class BaseModelFormSet(BaseFormSet):
|
|||||||
return []
|
return []
|
||||||
# Put the objects from self.get_queryset into a dict so they are easy to lookup by pk
|
# Put the objects from self.get_queryset into a dict so they are easy to lookup by pk
|
||||||
existing_objects = {}
|
existing_objects = {}
|
||||||
for obj in self.get_queryset():
|
for obj in self.queryset:
|
||||||
existing_objects[obj._get_pk_val()] = obj
|
existing_objects[obj._get_pk_val()] = obj
|
||||||
saved_instances = []
|
saved_instances = []
|
||||||
for form in self.change_forms:
|
for form in self.change_forms:
|
||||||
@ -336,32 +333,6 @@ class BaseModelFormSet(BaseFormSet):
|
|||||||
form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput)
|
form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput)
|
||||||
super(BaseModelFormSet, self).add_fields(form, index)
|
super(BaseModelFormSet, self).add_fields(form, index)
|
||||||
|
|
||||||
def formset_for_queryset(queryset, form=BaseForm, formfield_callback=lambda f: f.formfield(),
|
|
||||||
formset=BaseModelFormSet, extra=1, orderable=False, deletable=False, fields=None):
|
|
||||||
"""
|
|
||||||
Returns a FormSet class for the given QuerySet. This FormSet will contain
|
|
||||||
change forms for every instance in the QuerySet as well as the number of
|
|
||||||
add forms specified by ``extra``.
|
|
||||||
|
|
||||||
Provide ``extra`` to determine the number of add forms to display.
|
|
||||||
|
|
||||||
Provide ``deletable`` if you want to allow the formset to delete any
|
|
||||||
objects in the given queryset.
|
|
||||||
|
|
||||||
Provide ``form`` if you want to use a custom BaseForm subclass.
|
|
||||||
|
|
||||||
Provide ``formfield_callback`` if you want to define different logic for
|
|
||||||
determining the formfield for a given database field. It's a callable that
|
|
||||||
takes a database Field instance and returns a form Field instance.
|
|
||||||
|
|
||||||
Provide ``formset`` if you want to use a custom BaseModelFormSet subclass.
|
|
||||||
"""
|
|
||||||
form = form_for_model(queryset.model, form=form, fields=fields, formfield_callback=formfield_callback)
|
|
||||||
FormSet = formset_for_form(form, formset, extra, orderable, deletable)
|
|
||||||
FormSet.model = queryset.model
|
|
||||||
FormSet.queryset = queryset
|
|
||||||
return FormSet
|
|
||||||
|
|
||||||
def formset_for_model(model, form=BaseForm, formfield_callback=lambda f: f.formfield(),
|
def formset_for_model(model, form=BaseForm, formfield_callback=lambda f: f.formfield(),
|
||||||
formset=BaseModelFormSet, extra=1, orderable=False, deletable=False, fields=None):
|
formset=BaseModelFormSet, extra=1, orderable=False, deletable=False, fields=None):
|
||||||
"""
|
"""
|
||||||
@ -372,8 +343,10 @@ def formset_for_model(model, form=BaseForm, formfield_callback=lambda f: f.formf
|
|||||||
This is essentially the same as ``formset_for_queryset``, but automatically
|
This is essentially the same as ``formset_for_queryset``, but automatically
|
||||||
uses the model's default manager to determine the queryset.
|
uses the model's default manager to determine the queryset.
|
||||||
"""
|
"""
|
||||||
qs = model._default_manager.all()
|
form = form_for_model(model, form=form, fields=fields, formfield_callback=formfield_callback)
|
||||||
return formset_for_queryset(qs, form, formfield_callback, formset, extra, orderable, deletable, fields)
|
FormSet = formset_for_form(form, formset, extra, orderable, deletable)
|
||||||
|
FormSet.model = model
|
||||||
|
return FormSet
|
||||||
|
|
||||||
class InlineFormset(BaseModelFormSet):
|
class InlineFormset(BaseModelFormSet):
|
||||||
"""A formset for child objects related to a parent."""
|
"""A formset for child objects related to a parent."""
|
||||||
@ -382,7 +355,8 @@ class InlineFormset(BaseModelFormSet):
|
|||||||
self.instance = instance
|
self.instance = instance
|
||||||
# is there a better way to get the object descriptor?
|
# is there a better way to get the object descriptor?
|
||||||
self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
|
self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
|
||||||
super(InlineFormset, self).__init__(data, files, prefix=self.rel_name)
|
qs = self.get_queryset()
|
||||||
|
super(InlineFormset, self).__init__(qs, data, files, prefix=self.rel_name)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
"""
|
"""
|
||||||
@ -390,10 +364,10 @@ class InlineFormset(BaseModelFormSet):
|
|||||||
self.instance
|
self.instance
|
||||||
"""
|
"""
|
||||||
kwargs = {self.fk.name: self.instance}
|
kwargs = {self.fk.name: self.instance}
|
||||||
return self.queryset.filter(**kwargs)
|
return self.model._default_manager.filter(**kwargs)
|
||||||
|
|
||||||
def save_new(self, form, commit=True):
|
def save_new(self, form, commit=True):
|
||||||
kwargs = {self.fk.get_attname(): self.instance._get_pk_val()}
|
kwargs = {self.fk.get_attname(): self.instance.pk}
|
||||||
new_obj = self.model(**kwargs)
|
new_obj = self.model(**kwargs)
|
||||||
return save_instance(form, new_obj, commit=commit)
|
return save_instance(form, new_obj, commit=commit)
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ class Book(models.Model):
|
|||||||
|
|
||||||
__test__ = {'API_TESTS': """
|
__test__ = {'API_TESTS': """
|
||||||
|
|
||||||
>>> from django.newforms.models import formset_for_queryset, formset_for_model
|
>>> from django.newforms.models import formset_for_model
|
||||||
|
|
||||||
>>> qs = Author.objects.all()
|
>>> qs = Author.objects.all()
|
||||||
>>> AuthorFormSet = formset_for_model(Author, extra=3)
|
>>> AuthorFormSet = formset_for_model(Author, extra=3)
|
||||||
|
|
||||||
>>> formset = AuthorFormSet()
|
>>> formset = AuthorFormSet(qs)
|
||||||
>>> for form in formset.forms:
|
>>> for form in formset.forms:
|
||||||
... print form.as_p()
|
... print form.as_p()
|
||||||
<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /><input type="hidden" name="form-0-id" id="id_form-0-id" /></p>
|
<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /><input type="hidden" name="form-0-id" id="id_form-0-id" /></p>
|
||||||
@ -35,7 +35,7 @@ __test__ = {'API_TESTS': """
|
|||||||
... 'form-2-name': '',
|
... 'form-2-name': '',
|
||||||
... }
|
... }
|
||||||
|
|
||||||
>>> formset = AuthorFormSet(data=data)
|
>>> formset = AuthorFormSet(qs, data=data)
|
||||||
>>> formset.is_valid()
|
>>> formset.is_valid()
|
||||||
True
|
True
|
||||||
|
|
||||||
@ -54,9 +54,9 @@ We *could* use formset_for_queryset to restrict the Author objects we edit,
|
|||||||
but in that case we'll use it to display them in alphabetical order by name.
|
but in that case we'll use it to display them in alphabetical order by name.
|
||||||
|
|
||||||
>>> qs = Author.objects.order_by('name')
|
>>> qs = Author.objects.order_by('name')
|
||||||
>>> AuthorFormSet = formset_for_queryset(qs, extra=1, deletable=False)
|
>>> AuthorFormSet = formset_for_model(Author, extra=1, deletable=False)
|
||||||
|
|
||||||
>>> formset = AuthorFormSet()
|
>>> formset = AuthorFormSet(qs)
|
||||||
>>> for form in formset.forms:
|
>>> for form in formset.forms:
|
||||||
... print form.as_p()
|
... print form.as_p()
|
||||||
<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Arthur Rimbaud" maxlength="100" /><input type="hidden" name="form-0-id" value="2" id="id_form-0-id" /></p>
|
<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Arthur Rimbaud" maxlength="100" /><input type="hidden" name="form-0-id" value="2" id="id_form-0-id" /></p>
|
||||||
@ -73,7 +73,7 @@ but in that case we'll use it to display them in alphabetical order by name.
|
|||||||
... 'form-2-name': 'Paul Verlaine',
|
... 'form-2-name': 'Paul Verlaine',
|
||||||
... }
|
... }
|
||||||
|
|
||||||
>>> formset = AuthorFormSet(data=data)
|
>>> formset = AuthorFormSet(qs, data=data)
|
||||||
>>> formset.is_valid()
|
>>> formset.is_valid()
|
||||||
True
|
True
|
||||||
|
|
||||||
@ -91,9 +91,9 @@ This probably shouldn't happen, but it will. If an add form was marked for
|
|||||||
deltetion, make sure we don't save that form.
|
deltetion, make sure we don't save that form.
|
||||||
|
|
||||||
>>> qs = Author.objects.order_by('name')
|
>>> qs = Author.objects.order_by('name')
|
||||||
>>> AuthorFormSet = formset_for_queryset(qs, extra=1, deletable=True)
|
>>> AuthorFormSet = formset_for_model(Author, extra=1, deletable=True)
|
||||||
|
|
||||||
>>> formset = AuthorFormSet()
|
>>> formset = AuthorFormSet(qs)
|
||||||
>>> for form in formset.forms:
|
>>> for form in formset.forms:
|
||||||
... print form.as_p()
|
... print form.as_p()
|
||||||
<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Arthur Rimbaud" maxlength="100" /></p>
|
<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Arthur Rimbaud" maxlength="100" /></p>
|
||||||
@ -117,7 +117,7 @@ deltetion, make sure we don't save that form.
|
|||||||
... 'form-3-DELETE': 'on',
|
... 'form-3-DELETE': 'on',
|
||||||
... }
|
... }
|
||||||
|
|
||||||
>>> formset = AuthorFormSet(data=data)
|
>>> formset = AuthorFormSet(qs, data=data)
|
||||||
>>> formset.is_valid()
|
>>> formset.is_valid()
|
||||||
True
|
True
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user