Django

Code

Changeset 8528

Show
Ignore:
Timestamp:
08/24/08 22:51:25 (3 months ago)
Author:
brosner
Message:

Fixed #7888 -- Handle model inheritance with model formsets correctly. Thanks bpeschier for the report.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/models/fields/__init__.py

    r8526 r8528  
    9898        self.db_column = db_column 
    9999        self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE 
     100        self.auto_created = auto_created 
    100101 
    101102        # Set db_index to True if the field has a relationship and doesn't explicitly set db_index. 
  • django/trunk/django/forms/models.py

    r8489 r8528  
    9797    """ 
    9898    # avoid a circular import 
    99     from django.db.models.fields.related import ManyToManyField 
     99    from django.db.models.fields.related import ManyToManyField, OneToOneField 
    100100    opts = instance._meta 
    101101    data = {} 
     
    116116                # MultipleChoiceWidget needs a list of pks, not object instances. 
    117117                data[f.name] = [obj.pk for obj in f.value_from_object(instance)] 
     118        elif isinstance(f, OneToOneField): 
     119            data[f.attname] = f.value_from_object(instance) 
    118120        else: 
    119121            data[f.name] = f.value_from_object(instance) 
     
    318320    def add_fields(self, form, index): 
    319321        """Add a hidden field for the object's primary key.""" 
    320         if self.model._meta.has_auto_field: 
     322        if self.model._meta.pk.auto_created: 
    321323            self._pk_field_name = self.model._meta.pk.attname 
    322324            form.fields[self._pk_field_name] = IntegerField(required=False, widget=HiddenInput) 
  • django/trunk/tests/modeltests/model_formsets/models.py

    r8179 r8528  
    1414    def __unicode__(self): 
    1515        return self.name 
     16 
     17class BetterAuthor(Author): 
     18    write_speed = models.IntegerField() 
    1619 
    1720class Book(models.Model): 
     
    230233[[('id', 1), ('name', u'Charles Baudelaire')], [('id', 3), ('name', u'Paul Verlaine')], [('id', 2), ('name', u'Walt Whitman')]] 
    231234 
     235# Model inheritance in model formsets ######################################## 
     236 
     237>>> BetterAuthorFormSet = modelformset_factory(BetterAuthor) 
     238>>> formset = BetterAuthorFormSet() 
     239>>> for form in formset.forms: 
     240...     print form.as_p() 
     241<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" maxlength="100" /></p> 
     242<p><label for="id_form-0-write_speed">Write speed:</label> <input type="text" name="form-0-write_speed" id="id_form-0-write_speed" /><input type="hidden" name="form-0-author_ptr_id" id="id_form-0-author_ptr_id" /></p> 
     243 
     244>>> data = { 
     245...     'form-TOTAL_FORMS': '1', # the number of forms rendered 
     246...     'form-INITIAL_FORMS': '0', # the number of forms with initial data 
     247...     'form-0-author_ptr_id': '', 
     248...     'form-0-name': 'Ernest Hemingway', 
     249...     'form-0-write_speed': '10', 
     250... } 
     251 
     252>>> formset = BetterAuthorFormSet(data) 
     253>>> formset.is_valid() 
     254True 
     255>>> formset.save() 
     256[<BetterAuthor: Ernest Hemingway>] 
     257 
     258>>> formset = BetterAuthorFormSet() 
     259>>> for form in formset.forms: 
     260...     print form.as_p() 
     261<p><label for="id_form-0-name">Name:</label> <input id="id_form-0-name" type="text" name="form-0-name" value="Ernest Hemingway" maxlength="100" /></p> 
     262<p><label for="id_form-0-write_speed">Write speed:</label> <input type="text" name="form-0-write_speed" value="10" id="id_form-0-write_speed" /><input type="hidden" name="form-0-author_ptr_id" value="4" id="id_form-0-author_ptr_id" /></p> 
     263<p><label for="id_form-1-name">Name:</label> <input id="id_form-1-name" type="text" name="form-1-name" maxlength="100" /></p> 
     264<p><label for="id_form-1-write_speed">Write speed:</label> <input type="text" name="form-1-write_speed" id="id_form-1-write_speed" /><input type="hidden" name="form-1-author_ptr_id" id="id_form-1-author_ptr_id" /></p> 
     265 
     266>>> data = { 
     267...     'form-TOTAL_FORMS': '2', # the number of forms rendered 
     268...     'form-INITIAL_FORMS': '1', # the number of forms with initial data 
     269...     'form-0-author_ptr_id': '4', 
     270...     'form-0-name': 'Ernest Hemingway', 
     271...     'form-0-write_speed': '10', 
     272...     'form-1-author_ptr_id': '', 
     273...     'form-1-name': '', 
     274...     'form-1-write_speed': '', 
     275... } 
     276 
     277>>> formset = BetterAuthorFormSet(data) 
     278>>> formset.is_valid() 
     279True 
     280>>> formset.save() 
     281[] 
    232282 
    233283# Inline Formsets ############################################################ 
  • django/trunk/tests/modeltests/model_forms/models.py

    r8477 r8528  
    1313from django.db import models 
    1414from django.core.files.storage import FileSystemStorage 
     15 
     16# Python 2.3 doesn't have sorted() 
     17try: 
     18    sorted 
     19except NameError: 
     20    from django.utils.itercompat import sorted 
    1521 
    1622temp_storage = FileSystemStorage(tempfile.gettempdir()) 
     
    6066class ImprovedArticleWithParentLink(models.Model): 
    6167    article = models.OneToOneField(Article, parent_link=True) 
     68 
     69class BetterWriter(Writer): 
     70    pass 
    6271 
    6372class PhoneNumber(models.Model): 
     
    92101__test__ = {'API_TESTS': """ 
    93102>>> from django import forms 
    94 >>> from django.forms.models import ModelForm 
     103>>> from django.forms.models import ModelForm, model_to_dict 
    95104>>> from django.core.files.uploadedfile import SimpleUploadedFile 
    96105 
     
    794803[] 
    795804 
     805>>> bw = BetterWriter(name=u'Joe Better') 
     806>>> bw.save() 
     807>>> sorted(model_to_dict(bw).keys()) 
     808['id', 'name', 'writer_ptr_id'] 
     809 
    796810# PhoneNumberField ############################################################ 
    797811