Changeset 6072
- Timestamp:
- 09/09/07 14:10:52 (1 year ago)
- Files:
-
- django/branches/newforms-admin/django/contrib/admin/options.py (modified) (11 diffs)
- django/branches/newforms-admin/django/contrib/admin/sites.py (modified) (1 diff)
- django/branches/newforms-admin/django/contrib/admin/templates/admin/edit_inline_stacked.html (modified) (2 diffs)
- django/branches/newforms-admin/django/contrib/admin/templates/admin/edit_inline_tabular.html (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/branches/newforms-admin/django/contrib/admin/options.py
r6029 r6072 119 119 filter_vertical = () 120 120 filter_horizontal = () 121 prepopulated_fields = {} 122 121 123 def formfield_for_dbfield(self, db_field, **kwargs): 122 124 """ … … 161 163 # For any other type of field, just call its formfield() method. 162 164 return db_field.formfield(**kwargs) 165 166 def fieldsets(self, request): 167 """ 168 Generator that yields Fieldset objects for use on add and change admin 169 form pages. 170 171 This default implementation looks at self.fields, but subclasses can 172 override this implementation and do something special based on the 173 given HttpRequest object. 174 """ 175 if self.fields is None: 176 default_fields = [f.name for f in self.opts.fields + self.opts.many_to_many if f.editable and not isinstance(f, models.AutoField)] 177 yield Fieldset(fields=default_fields) 178 else: 179 for name, options in self.fields: 180 yield Fieldset(name, options['fields'], classes=options.get('classes', '').split(' '), description=options.get('description')) 163 181 164 182 class ModelAdmin(BaseModelAdmin): … … 176 194 save_on_top = False 177 195 ordering = None 178 prepopulated_fields = {}179 196 inlines = [] 180 197 181 def __init__(self, model ):198 def __init__(self, model, admin_site): 182 199 self.model = model 183 200 self.opts = model._meta 201 self.admin_site = admin_site 202 self.inline_instances = [] 203 for inline_class in self.inlines: 204 inline_instance = inline_class(self.model, self.admin_site) 205 self.inline_instances.append(inline_instance) 184 206 185 207 def __call__(self, request, url): … … 222 244 media = property(_media) 223 245 224 def fieldsets(self, request):225 """226 Generator that yields Fieldset objects for use on add and change admin227 form pages.228 229 This default implementation looks at self.fields, but subclasses can230 override this implementation and do something special based on the231 given HttpRequest object.232 """233 if self.fields is None:234 default_fields = [f.name for f in self.opts.fields + self.opts.many_to_many if f.editable and not isinstance(f, models.AutoField)]235 yield Fieldset(fields=default_fields)236 else:237 for name, options in self.fields:238 yield Fieldset(name, options['fields'], classes=options.get('classes', '').split(' '), description=options.get('description'))239 240 246 def fieldsets_add(self, request): 241 247 "Hook for specifying Fieldsets for the add form." … … 428 434 for fs in inline_formsets: 429 435 media = media + fs.media 430 436 437 inline_admin_formsets = [] 438 for inline, formset in zip(self.inline_instances, inline_formsets): 439 fieldsets = list(inline.fieldsets(request)) 440 inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) 441 inline_admin_formsets.append(inline_admin_formset) 442 431 443 c = template.RequestContext(request, { 432 444 'title': _('Add %s') % opts.verbose_name, … … 435 447 'show_delete': False, 436 448 'media': media, 437 ' bound_inlines': [BoundInline(i, fs) for i, fs in zip(self.inlines, inline_formsets)],449 'inline_admin_formsets': inline_admin_formsets, 438 450 }) 439 451 return render_change_form(self, model, model.AddManipulator(), c, add=True) … … 498 510 for fs in inline_formsets: 499 511 media = media + fs.media 500 512 513 inline_admin_formsets = [] 514 for inline, formset in zip(self.inline_instances, inline_formsets): 515 fieldsets = list(inline.fieldsets(request)) 516 inline_admin_formset = InlineAdminFormSet(inline, formset, fieldsets) 517 inline_admin_formsets.append(inline_admin_formset) 518 501 519 c = template.RequestContext(request, { 502 520 'title': _('Change %s') % opts.verbose_name, … … 506 524 'is_popup': request.REQUEST.has_key('_popup'), 507 525 'media': media, 508 ' bound_inlines': [BoundInline(i, fs) for i, fs in zip(self.inlines, inline_formsets)],526 'inline_admin_formsets': inline_admin_formsets, 509 527 }) 510 528 return render_change_form(self, model, model.ChangeManipulator(object_id), c, change=True) … … 610 628 611 629 def get_inline_formsets(self): 612 inline_formset_classes = [] 613 for opts in self.inlines: 614 inline = forms.inline_formset(self.model, opts.model, formfield_callback=opts.formfield_for_dbfield, fields=opts.fields, extra=opts.extra) 615 inline_formset_classes.append(inline) 616 return inline_formset_classes 630 for inline in self.inline_instances: 631 yield inline.formset_class 617 632 618 633 class InlineModelAdmin(BaseModelAdmin): … … 624 639 ``ForeignKey`` to its parent. 625 640 """ 626 def __init__(self, model, name=None, extra=3, fields=None, template=None, raw_id_fields=None): 627 self.model = model 628 self.opts = model._meta 629 self.name = name 630 self.extra = extra 631 self.fields = fields 632 self.template = template or self.default_template 633 self.verbose_name = model._meta.verbose_name 634 self.verbose_name_plural = model._meta.verbose_name_plural 635 self.prepopulated_fields = {} 636 self.raw_id_fields = raw_id_fields or () 637 638 class StackedInline(InlineModelAdmin): 639 default_template = 'admin/edit_inline_stacked.html' 640 641 class TabularInline(InlineModelAdmin): 642 default_template = 'admin/edit_inline_tabular.html' 643 644 class BoundInline(object): 645 def __init__(self, inline_admin, formset): 646 self.inline_admin = inline_admin 647 self.formset = formset 648 self.template = inline_admin.template 649 650 def __iter__(self): 651 for form, original in zip(self.formset.change_forms, self.formset.get_inline_objects()): 652 yield BoundInlineObject(self.formset, form, original, self.inline_admin) 653 for form in self.formset.add_forms: 654 yield BoundInlineObject(self.formset, form, None, self.inline_admin) 655 656 def fields(self): 657 return self.formset.form_class.base_fields.values() 658 659 def verbose_name(self): 660 return self.inline_admin.verbose_name 661 662 def verbose_name_plural(self): 663 return self.inline_admin.verbose_name_plural 664 665 class BoundInlineObject(object): 666 def __init__(self, formset, form, original, inline_admin): 667 self.formset = formset 668 self.inline_admin = inline_admin 669 self.base_form = form 670 self.form = AdminForm(form, self.fieldsets(), inline_admin.prepopulated_fields) 671 self.original = original 672 673 def fieldsets(self): 641 model = None 642 fk_name = None 643 extra = 3 644 template = None 645 label = None 646 647 def __init__(self, parent_model, admin_site): 648 self.admin_site = admin_site 649 self.parent_model = parent_model 650 self.opts = self.model._meta 651 # TODO: pass a fields arg into forms.inline_formset if/when we have one 652 self.formset_class = forms.inline_formset(parent_model, self.model, fk_name=self.fk_name, formfield_callback=self.formfield_for_dbfield, extra=self.extra) 653 654 def fieldsets(self, request): 674 655 """ 675 656 Generator that yields Fieldset objects for use on add and change admin … … 680 661 given HttpRequest object. 681 662 """ 682 if self.inline_admin.fields is None: 683 default_fields = [f for f in self.base_form.base_fields] 684 yield Fieldset(fields=default_fields) 685 else: 686 for name, options in self.opts.fields: 663 if self.fields is None: 664 yield Fieldset(fields=self.formset_class.form_class.base_fields) 665 else: 666 for name, options in self.fields: 687 667 yield Fieldset(name, options['fields'], classes=options.get('classes', '').split(' '), description=options.get('description')) 688 668 669 class StackedInline(InlineModelAdmin): 670 template = 'admin/edit_inline_stacked.html' 671 672 def get_label(self): 673 return self.label or self.model._meta.verbose_name 674 675 class TabularInline(InlineModelAdmin): 676 template = 'admin/edit_inline_tabular.html' 677 678 def get_label(self): 679 return self.label or self.model._meta.verbose_name_plural 680 681 class InlineAdminFormSet(object): 682 """ 683 A wrapper around an inline formset for use in the admin system. 684 """ 685 def __init__(self, inline, formset, fieldsets): 686 self.opts = inline 687 self.formset = formset 688 self.fieldsets = fieldsets 689 690 def __iter__(self): 691 for form, original in zip(self.formset.change_forms, self.formset.get_inline_objects()): 692 yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, original) 693 for form in self.formset.add_forms: 694 yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, None) 695 696 def fields(self): 697 # TODO: this needs to respect the field order of self.fieldsets 698 return self.formset.form_class.base_fields.values() 699 700 class InlineAdminForm(AdminForm): 701 """ 702 A wrapper around an inline form for use in the admin system. 703 """ 704 def __init__(self, formset, form, fieldsets, prepopulated_fields, original): 705 self.formset = formset 706 self.original = original 707 super(InlineAdminForm, self).__init__(form, fieldsets, prepopulated_fields) 708 689 709 def pk_field(self): 690 return BoundField(self. base_form, self.formset._pk_field_name, False)710 return BoundField(self.form, self.formset._pk_field_name, False) 691 711 692 712 def deletion_field(self): 693 713 from django.newforms.formsets import DELETION_FIELD_NAME 694 return BoundField(self. base_form, DELETION_FIELD_NAME, False)714 return BoundField(self.form, DELETION_FIELD_NAME, False) 695 715 696 716 def ordering_field(self): 697 717 from django.newforms.formsets import ORDERING_FIELD_NAME 698 return BoundField(self. base_form, ORDERING_FIELD_NAME, False)718 return BoundField(self.form, ORDERING_FIELD_NAME, False) django/branches/newforms-admin/django/contrib/admin/sites.py
r6000 r6072 78 78 if model in self._registry: 79 79 raise AlreadyRegistered('The model %s is already registered' % model.__name__) 80 self._registry[model] = admin_class(model )80 self._registry[model] = admin_class(model, self) 81 81 82 82 def unregister(self, model_or_iterable): django/branches/newforms-admin/django/contrib/admin/templates/admin/edit_inline_stacked.html
r6055 r6072 1 {{ bound_inline.formset.management_form }}2 {% for bound_inline_object in bound_inline%}1 {{ inline_admin_formset.formset.management_form }} 2 {% for inline_admin_form in inline_admin_formset %} 3 3 <fieldset class="module aligned {{ bfset.fieldset.classes }}"> 4 <h2>{{ bound_inline.verbose_name|title }} #{{ forloop.counter }}</h2> 5 {% for bfset in bound_inline_object.form %} 6 {% if bfset.fieldset.name %}<h2>{{ bfset.fieldset.name }}</h2>{% endif %} 7 {% if bfset.fieldset.description %}<div class="description">{{ bfset.fieldset.description }}</div>{% endif %} 4 <h2>{{ inline_admin_formset.opts.get_label|title }} #{{ forloop.counter }}</h2> 5 {% for bfset in inline_admin_form %} 6 <!-- fieldsets, headers, and descriptions are commented out until we have decent styles for them --> 7 <!--<fieldset>--> 8 <!--{% if bfset.fieldset.name %}<h2>{{ bfset.fieldset.name }}</h2>{% endif %}--> 9 <!--{% if bfset.fieldset.description %}<div class="description">{{ bfset.fieldset.description }}</div>{% endif %}--> 8 10 {% for line in bfset %} 9 11 <div class="form-row{% if line.errors %} errors{% endif %}"> … … 19 21 </div> 20 22 {% endfor %} 21 {{ bound_inline_object.pk_field.field }} 22 {% if bound_inline.formset.deletable %}<div class="form-row">{{ bound_inline_object.deletion_field.field }} {{ bound_inline_object.deletion_field.label_tag }}</div>{% endif %} 23 <!--</fieldset>--> 23 24 {% endfor %} 25 {{ inline_admin_form.pk_field.field }} 26 {% if inline_admin_formset.formset.deletable %}<div class="form-row">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</div>{% endif %} 24 27 </fieldset> 25 28 {% endfor %} django/branches/newforms-admin/django/contrib/admin/templates/admin/edit_inline_tabular.html
r6036 r6072 1 1 {% load i18n %} 2 {{ bound_inline.formset.management_form }}2 {{ inline_admin_formset.formset.management_form }} 3 3 <fieldset class="module"> 4 <h2>{{ bound_inline.verbose_name_plural|capfirst|escape }}</h2>4 <h2>{{ inline_admin_formset.opts.get_label|capfirst|escape }}</h2> 5 5 <table> 6 6 <thead><tr> 7 {% if bound_inline.formset.deletable %}<th>{% trans "Delete" %}?</th>{% endif %}8 {% for field in bound_inline.fields %}7 {% if inline_admin_formset.formset.deletable %}<th>{% trans "Delete" %}?</th>{% endif %} 8 {% for field in inline_admin_formset.fields %} 9 9 {% if not field.is_hidden %} 10 10 <th>{{ field.label|capfirst|escape }}</th> … … 13 13 </tr></thead> 14 14 15 {% for bound_inline_object in bound_inline%}15 {% for inline_admin_form in inline_admin_formset %} 16 16 17 17 <!-- still need optional original object --> 18 18 19 {% if bound_inline_object.form.form.errors %}19 {% if inline_admin_form.form.errors %} 20 20 <tr class="errorlist"><td colspan="{{ bound_inline.fields|length }}"> 21 {{ bound_inline_object.form.form.errors }}21 {{ inline_admin_form.form.errors }} 22 22 </tr> 23 23 {% endif %} 24 24 25 25 <tr class="{% cycle row1,row2 %}"> 26 {{ bound_inline_object.pk_field.field }}27 {% if bound_inline.formset.deletable %}<td>{{ bound_inline_object.deletion_field.field }}</td>{% endif %}28 {% for bfset in bound_inline_object.form %}26 {{ inline_admin_form.pk_field.field }} 27 {% if inline_admin_formset.formset.deletable %}<td>{{ inline_admin_form.deletion_field.field }}</td>{% endif %} 28 {% for bfset in inline_admin_form %} 29 29 {% for line in bfset %} 30 30 {% for field in line %}
