diff --git a/django/contrib/admin/templates/widget/foreign.html b/django/contrib/admin/templates/widget/foreign.html
index d305066066..bdc164e654 100644
--- a/django/contrib/admin/templates/widget/foreign.html
+++ b/django/contrib/admin/templates/widget/foreign.html
@@ -1,8 +1,8 @@
{% load admin_modify adminmedia %}
{% output_all bound_field.form_fields %}
{% if bound_field.raw_id_admin %}
- FIXURL
+
{% else %}
{% if bound_field.needs_add_label %}
- FIXURL
+
{% endif %}{% endif %}
diff --git a/django/contrib/admin/templatetags/admin_modify.py b/django/contrib/admin/templatetags/admin_modify.py
index 48d016164a..136a9c8dcf 100644
--- a/django/contrib/admin/templatetags/admin_modify.py
+++ b/django/contrib/admin/templatetags/admin_modify.py
@@ -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):
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index d0b0be3e73..aa069018aa 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -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)
diff --git a/django/db/models/__init__.py b/django/db/models/__init__.py
index 88a3a5ce23..4711e69d4e 100644
--- a/django/db/models/__init__.py
+++ b/django/db/models/__init__.py
@@ -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."
diff --git a/django/db/models/fields.py b/django/db/models/fields.py
index 75707390eb..cbcb385764 100644
--- a/django/db/models/fields.py
+++ b/django/db/models/fields.py
@@ -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):