Django

Code

Changeset 7603

Show
Ignore:
Timestamp:
06/09/08 22:54:05 (6 months ago)
Author:
brosner
Message:

newforms-admin: Fixed #5520 -- Implemented save_as functionality. This also
properly makes inlines work as well.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/newforms-admin/django/contrib/admin/options.py

    r7588 r7603  
    448448            'opts': opts, 
    449449            'content_type_id': ContentType.objects.get_for_model(model).id, 
     450            'save_as': self.save_as, 
    450451            'save_on_top': self.save_on_top, 
    451452        } 
     
    478479            form = ModelForm(request.POST, request.FILES) 
    479480            for FormSet in self.get_formsets(request): 
    480                 inline_formset = FormSet(data=request.POST, files=request.FILES, instance=obj) 
     481                inline_formset = FormSet(data=request.POST, files=request.FILES, 
     482                    instance=obj, save_as_new=request.POST.has_key("_saveasnew")) 
    481483                inline_formsets.append(inline_formset) 
    482484            if all_valid(inline_formsets) and form.is_valid(): 
  • django/branches/newforms-admin/django/contrib/admin/templatetags/admin_modify.py

    r6797 r7603  
    2121    change = context['change'] 
    2222    is_popup = context['is_popup'] 
    23     # TODO: Fix this hack. 
    24     # save_as = opts.admin.save_as 
    25     save_as = False 
     23    save_as = context['save_as'] 
    2624    return { 
    2725        'onclick_attrib': (opts.get_ordered_objects() and change 
  • django/branches/newforms-admin/django/newforms/formsets.py

    r7587 r7603  
    5858            self.management_form = ManagementForm(initial=initial, auto_id=self.auto_id, prefix=self.prefix) 
    5959 
     60        # construct the forms in the formset 
     61        self._construct_forms() 
     62 
     63    def __unicode__(self): 
     64        return self.as_table() 
     65 
     66    def _construct_forms(self): 
    6067        # instantiate all the forms and put them in self.forms 
    6168        self.forms = [] 
    62         for i in range(self._total_form_count): 
     69        for i in xrange(self._total_form_count): 
    6370            self.forms.append(self._construct_form(i)) 
    64  
    65     def __unicode__(self): 
    66         return self.as_table() 
    67  
     71     
    6872    def _construct_form(self, i): 
    6973        """ 
  • django/branches/newforms-admin/django/newforms/models.py

    r7508 r7603  
    303303    model = None 
    304304 
    305     def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, queryset=None): 
     305    def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None, 
     306                 queryset=None, **kwargs): 
    306307        self.queryset = queryset 
    307         kwargs = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix} 
    308         kwargs['initial'] = [model_to_dict(obj) for obj in self.get_queryset()] 
    309         super(BaseModelFormSet, self).__init__(**kwargs) 
     308        defaults = {'data': data, 'files': files, 'auto_id': auto_id, 'prefix': prefix} 
     309        defaults['initial'] = [model_to_dict(obj) for obj in self.get_queryset()] 
     310        defaults.update(kwargs) 
     311        super(BaseModelFormSet, self).__init__(**defaults) 
    310312 
    311313    def get_queryset(self): 
     
    387389class BaseInlineFormset(BaseModelFormSet): 
    388390    """A formset for child objects related to a parent.""" 
    389     def __init__(self, data=None, files=None, instance=None): 
     391    def __init__(self, data=None, files=None, instance=None, save_as_new=False): 
    390392        from django.db.models.fields.related import RelatedObject 
    391393        self.instance = instance 
     394        self.save_as_new = save_as_new 
    392395        # is there a better way to get the object descriptor? 
    393396        self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name() 
    394397        super(BaseInlineFormset, self).__init__(data, files, prefix=self.rel_name) 
     398     
     399    def _construct_forms(self): 
     400        from django.newforms.formsets import INITIAL_FORM_COUNT 
     401        if self.save_as_new: 
     402            self._total_form_count = self.management_form.cleaned_data[INITIAL_FORM_COUNT] 
     403            self._initial_form_count = 0 
     404        super(BaseInlineFormset, self)._construct_forms() 
    395405 
    396406    def get_queryset(self): 
  • django/branches/newforms-admin/tests/modeltests/model_formsets/models.py

    r7507 r7603  
    233233Les Fleurs du Mal 
    234234 
     235The save_as_new parameter lets you re-associate the data to a new instance. 
     236This is used in the admin for save_as functionality. 
     237 
     238>>> data = { 
     239...     'book_set-TOTAL_FORMS': '3', # the number of forms rendered 
     240...     'book_set-INITIAL_FORMS': '2', # the number of forms with initial data 
     241...     'book_set-0-id': '1', 
     242...     'book_set-0-title': 'Les Fleurs du Mal', 
     243...     'book_set-1-id': '2', 
     244...     'book_set-1-title': 'Le Spleen de Paris', 
     245...     'book_set-2-title': '', 
     246... } 
     247 
     248>>> formset = AuthorBooksFormSet(data, instance=Author(), save_as_new=True) 
     249>>> formset.is_valid() 
     250True 
     251 
     252>>> new_author = Author.objects.create(name='Charles Baudelaire') 
     253>>> formset.instance = new_author 
     254>>> [book for book in formset.save() if book.author.pk == new_author.pk] 
     255[<Book: Les Fleurs du Mal>, <Book: Le Spleen de Paris>] 
     256 
    235257"""}