mirror of
				https://github.com/django/django.git
				synced 2025-10-30 17:16:10 +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 %} | ||||
| {% output_all bound_field.form_fields %} | ||||
| {% 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 %} | ||||
| {% 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 %} | ||||
|   | ||||
| @@ -101,13 +101,13 @@ class FieldWrapper(object): | ||||
|         self.field = field | ||||
|  | ||||
|     def needs_header(self): | ||||
|         return not isinstance(self.field, meta.AutoField) | ||||
|         return not isinstance(self.field, models.AutoField) | ||||
|  | ||||
|     def header_class_attribute(self): | ||||
|         return self.field.blank and ' class="optional"' or '' | ||||
|  | ||||
|     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 | ||||
|  | ||||
| class FormFieldCollectionWrapper(object): | ||||
|   | ||||
| @@ -40,6 +40,8 @@ IS_POPUP_VAR = 'pop' | ||||
| # Text to display within changelist table cells if the value is blank. | ||||
| EMPTY_CHANGELIST_VALUE = '(None)' | ||||
|  | ||||
| ADMIN_PREFIX = "/admin/" | ||||
|  | ||||
| def _get_mod_opts(app_label, module_name): | ||||
|     "Helper function that returns a tuple of (module, opts), raising Http404 if necessary." | ||||
|     try: | ||||
| @@ -96,6 +98,22 @@ def get_model_and_app(path): | ||||
|              | ||||
|     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): | ||||
|     return render_to_response('admin/index', {'title': _('Site administration')}, context_instance=Context(request)) | ||||
| index = staff_member_required(index) | ||||
| @@ -351,6 +369,9 @@ class AdminBoundField(BoundField): | ||||
|             self.cell_class_attribute = ' class="%s" ' % ' '.join(classes) | ||||
|         self._repr_filled = False | ||||
|  | ||||
|         if field.rel: | ||||
|             self.related_url = url_for_model(field.rel.to) | ||||
|  | ||||
|     def _fetch_existing_display(self, func_name): | ||||
|         class_dict = self.original.__class__.__dict__ | ||||
|         func = class_dict.get(func_name) | ||||
|   | ||||
| @@ -813,6 +813,7 @@ class AutomaticManipulator(formfields.Manipulator): | ||||
|          | ||||
|     def save(self, new_data): | ||||
|         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. | ||||
|         from django.utils.datastructures import DotExpandedDict | ||||
|         params = {} | ||||
| @@ -918,7 +919,7 @@ class AutomaticManipulator(formfields.Manipulator): | ||||
|                            params[f.attname] = param | ||||
|      | ||||
|                     # 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_cores_given: | ||||
| @@ -976,8 +977,8 @@ class ModelAddManipulator(AutomaticManipulator): | ||||
|         super(ModelAddManipulator, self).__init__(follow=follow) | ||||
|          | ||||
| class ModelChangeManipulator(AutomaticManipulator): | ||||
|     change = False | ||||
|     add = True | ||||
|     change = True | ||||
|     add = False | ||||
|      | ||||
|     def __init__(self, obj_key=None, follow=None): | ||||
|         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. | ||||
|         # EXAMPLE: Poll.add_choice() | ||||
|         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): | ||||
|   | ||||
		Reference in New Issue
	
	Block a user