mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Now possible to save in a changeform
git-svn-id: http://code.djangoproject.com/svn/django/branches/magic-removal@1691 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -1,8 +1,8 @@ | |||||||
| {% load admin_modify adminmedia %} | {% load admin_modify adminmedia %} | ||||||
| {% output_all bound_field.form_fields %} | {% output_all bound_field.form_fields %} | ||||||
| {% if bound_field.raw_id_admin %} | {% if bound_field.raw_id_admin %} | ||||||
|     FIXURL<a href="" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> |     <a href="{{bound_field.related_url}}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a> | ||||||
| {% else %} | {% else %} | ||||||
| {% if bound_field.needs_add_label %} | {% if bound_field.needs_add_label %} | ||||||
|     FIXURL<a href="/add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a> |     <a href="{{bound_field.related_url}}add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a> | ||||||
| {% endif %}{% endif %} | {% endif %}{% endif %} | ||||||
|   | |||||||
| @@ -101,13 +101,13 @@ class FieldWrapper(object): | |||||||
|         self.field = field |         self.field = field | ||||||
|  |  | ||||||
|     def needs_header(self): |     def needs_header(self): | ||||||
|         return not isinstance(self.field, meta.AutoField) |         return not isinstance(self.field, models.AutoField) | ||||||
|  |  | ||||||
|     def header_class_attribute(self): |     def header_class_attribute(self): | ||||||
|         return self.field.blank and ' class="optional"' or '' |         return self.field.blank and ' class="optional"' or '' | ||||||
|  |  | ||||||
|     def use_raw_id_admin(self): |     def use_raw_id_admin(self): | ||||||
|          return isinstance(self.field.rel, (meta.ManyToOne, meta.ManyToMany)) \ |          return isinstance(self.field.rel, (models.ManyToOne, models.ManyToMany)) \ | ||||||
|             and self.field.rel.raw_id_admin |             and self.field.rel.raw_id_admin | ||||||
|  |  | ||||||
| class FormFieldCollectionWrapper(object): | class FormFieldCollectionWrapper(object): | ||||||
|   | |||||||
| @@ -40,6 +40,8 @@ IS_POPUP_VAR = 'pop' | |||||||
| # Text to display within changelist table cells if the value is blank. | # Text to display within changelist table cells if the value is blank. | ||||||
| EMPTY_CHANGELIST_VALUE = '(None)' | EMPTY_CHANGELIST_VALUE = '(None)' | ||||||
|  |  | ||||||
|  | ADMIN_PREFIX = "/admin/" | ||||||
|  |  | ||||||
| def _get_mod_opts(app_label, module_name): | def _get_mod_opts(app_label, module_name): | ||||||
|     "Helper function that returns a tuple of (module, opts), raising Http404 if necessary." |     "Helper function that returns a tuple of (module, opts), raising Http404 if necessary." | ||||||
|     try: |     try: | ||||||
| @@ -96,6 +98,22 @@ def get_model_and_app(path): | |||||||
|              |              | ||||||
|     raise Http404 # Couldn't find app |     raise Http404 # Couldn't find app | ||||||
|  |  | ||||||
|  | _model_urls = {} | ||||||
|  |  | ||||||
|  | def url_for_model(model): | ||||||
|  |     try: | ||||||
|  |         return _model_urls[model] | ||||||
|  |     except KeyError: | ||||||
|  |         comps = model.__module__.split('.') | ||||||
|  |         for mod in models.get_installed_models():   | ||||||
|  |             remaining, matched =  matches_app(mod, comps) | ||||||
|  |             if matched and len(remaining) > 0: | ||||||
|  |                 comps = comps[: - len(remaining)] + remaining[1:] | ||||||
|  |                 url = "%s%s/%s/" % (ADMIN_PREFIX, '/'.join(comps) , model.__name__.lower() ) | ||||||
|  |                 _model_urls[model] = url | ||||||
|  |                 return url | ||||||
|  |         raise ImproperlyConfigured('%s is not a model in an installed app' % model.__name__ ) | ||||||
|  |  | ||||||
| def index(request): | def index(request): | ||||||
|     return render_to_response('admin/index', {'title': _('Site administration')}, context_instance=Context(request)) |     return render_to_response('admin/index', {'title': _('Site administration')}, context_instance=Context(request)) | ||||||
| index = staff_member_required(index) | index = staff_member_required(index) | ||||||
| @@ -351,6 +369,9 @@ class AdminBoundField(BoundField): | |||||||
|             self.cell_class_attribute = ' class="%s" ' % ' '.join(classes) |             self.cell_class_attribute = ' class="%s" ' % ' '.join(classes) | ||||||
|         self._repr_filled = False |         self._repr_filled = False | ||||||
|  |  | ||||||
|  |         if field.rel: | ||||||
|  |             self.related_url = url_for_model(field.rel.to) | ||||||
|  |  | ||||||
|     def _fetch_existing_display(self, func_name): |     def _fetch_existing_display(self, func_name): | ||||||
|         class_dict = self.original.__class__.__dict__ |         class_dict = self.original.__class__.__dict__ | ||||||
|         func = class_dict.get(func_name) |         func = class_dict.get(func_name) | ||||||
|   | |||||||
| @@ -813,6 +813,7 @@ class AutomaticManipulator(formfields.Manipulator): | |||||||
|          |          | ||||||
|     def save(self, new_data): |     def save(self, new_data): | ||||||
|         add, change, opts, klass = self.add, self.change, self.opts, self.model |         add, change, opts, klass = self.add, self.change, self.opts, self.model | ||||||
|  |         print add, change, opts, klass  | ||||||
|         # TODO: big cleanup when core fields go -> use recursive manipulators. |         # TODO: big cleanup when core fields go -> use recursive manipulators. | ||||||
|         from django.utils.datastructures import DotExpandedDict |         from django.utils.datastructures import DotExpandedDict | ||||||
|         params = {} |         params = {} | ||||||
| @@ -918,7 +919,7 @@ class AutomaticManipulator(formfields.Manipulator): | |||||||
|                            params[f.attname] = param |                            params[f.attname] = param | ||||||
|      |      | ||||||
|                     # Create the related item. |                     # Create the related item. | ||||||
|                     new_rel_obj = related.opts.get_model_module().Klass(**params) |                     new_rel_obj = related.model(**params) | ||||||
|      |      | ||||||
|                     # If all the core fields were provided (non-empty), save the item. |                     # If all the core fields were provided (non-empty), save the item. | ||||||
|                     if all_cores_given: |                     if all_cores_given: | ||||||
| @@ -976,8 +977,8 @@ class ModelAddManipulator(AutomaticManipulator): | |||||||
|         super(ModelAddManipulator, self).__init__(follow=follow) |         super(ModelAddManipulator, self).__init__(follow=follow) | ||||||
|          |          | ||||||
| class ModelChangeManipulator(AutomaticManipulator): | class ModelChangeManipulator(AutomaticManipulator): | ||||||
|     change = False |     change = True | ||||||
|     add = True |     add = False | ||||||
|      |      | ||||||
|     def __init__(self, obj_key=None, follow=None): |     def __init__(self, obj_key=None, follow=None): | ||||||
|         assert obj_key is not None, "ChangeManipulator.__init__() must be passed obj_key parameter." |         assert obj_key is not None, "ChangeManipulator.__init__() must be passed obj_key parameter." | ||||||
|   | |||||||
| @@ -758,7 +758,8 @@ class ForeignKey(Field): | |||||||
|         # but only for related objects that are in the same app. |         # but only for related objects that are in the same app. | ||||||
|         # EXAMPLE: Poll.add_choice() |         # EXAMPLE: Poll.add_choice() | ||||||
|         if related.opts.app_label == cls._meta.app_label: |         if related.opts.app_label == cls._meta.app_label: | ||||||
|             setattr(cls, 'add_%s' % rel_obj_name, curry(cls._add_related, rel_class=related.model, rel_field=related.field)) |             func = lambda self, *args, **kwargs: self._add_related(related.model, related.field, *args, **kwargs)  | ||||||
|  |             setattr(cls, 'add_%s' % rel_obj_name, func) | ||||||
|  |  | ||||||
|  |  | ||||||
| class ManyToManyField(Field): | class ManyToManyField(Field): | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user