diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 2d04bbbc4b..be0fcc10f0 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -140,8 +140,9 @@ class BaseModelAdmin(object): """ Get a form Field for a ForeignKey. """ + db = kwargs.get('using') if db_field.name in self.raw_id_fields: - kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel) + kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel, using=db) elif db_field.name in self.radio_fields: kwargs['widget'] = widgets.AdminRadioSelect(attrs={ 'class': get_ul_class(self.radio_fields[db_field.name]), @@ -158,9 +159,10 @@ class BaseModelAdmin(object): # a field in admin. if not db_field.rel.through._meta.auto_created: return None + db = kwargs.get('using') if db_field.name in self.raw_id_fields: - kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel) + kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel, using=db) kwargs['help_text'] = '' elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)): kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical)) @@ -731,7 +733,7 @@ class ModelAdmin(BaseModelAdmin): form_validated = False new_object = self.model() prefixes = {} - for FormSet in self.get_formsets(request): + for FormSet, inline in zip(self.get_formsets(request), self.inline_instances): prefix = FormSet.get_default_prefix() prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1: @@ -739,7 +741,7 @@ class ModelAdmin(BaseModelAdmin): formset = FormSet(data=request.POST, files=request.FILES, instance=new_object, save_as_new=request.POST.has_key("_saveasnew"), - prefix=prefix) + prefix=prefix, queryset=inline.queryset(request)) formsets.append(formset) if all_valid(formsets) and form_validated: self.save_model(request, new_object, form, change=False) @@ -762,12 +764,14 @@ class ModelAdmin(BaseModelAdmin): initial[k] = initial[k].split(",") form = ModelForm(initial=initial) prefixes = {} - for FormSet in self.get_formsets(request): + for FormSet, inline in zip(self.get_formsets(request), + self.inline_instances): prefix = FormSet.get_default_prefix() prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1: prefix = "%s-%s" % (prefix, prefixes[prefix]) - formset = FormSet(instance=self.model(), prefix=prefix) + formset = FormSet(instance=self.model(), prefix=prefix, + queryset=inline.queryset(request)) formsets.append(formset) adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields) @@ -829,13 +833,16 @@ class ModelAdmin(BaseModelAdmin): form_validated = False new_object = obj prefixes = {} - for FormSet in self.get_formsets(request, new_object): + for FormSet, inline in zip(self.get_formsets(request, new_object), + self.inline_instances): prefix = FormSet.get_default_prefix() prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1: prefix = "%s-%s" % (prefix, prefixes[prefix]) formset = FormSet(request.POST, request.FILES, - instance=new_object, prefix=prefix) + instance=new_object, prefix=prefix, + queryset=inline.queryset(request)) + formsets.append(formset) if all_valid(formsets) and form_validated: @@ -851,12 +858,13 @@ class ModelAdmin(BaseModelAdmin): else: form = ModelForm(instance=obj) prefixes = {} - for FormSet in self.get_formsets(request, obj): + for FormSet, inline in zip(self.get_formsets(request, obj), self.inline_instances): prefix = FormSet.get_default_prefix() prefixes[prefix] = prefixes.get(prefix, 0) + 1 if prefixes[prefix] != 1: prefix = "%s-%s" % (prefix, prefixes[prefix]) - formset = FormSet(instance=obj, prefix=prefix) + formset = FormSet(instance=obj, prefix=prefix, + queryset=inline.queryset(request)) formsets.append(formset) adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields) @@ -1178,6 +1186,9 @@ class InlineModelAdmin(BaseModelAdmin): form = self.get_formset(request).form return [(None, {'fields': form.base_fields.keys()})] + def queryset(self, request): + return self.model._default_manager.all() + class StackedInline(InlineModelAdmin): template = 'admin/edit_inline/stacked.html' diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index fb5acb5295..105de48ed3 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -102,8 +102,9 @@ class ForeignKeyRawIdWidget(forms.TextInput): A Widget for displaying ForeignKeys in the "raw_id" interface rather than in a box. """ - def __init__(self, rel, attrs=None): - super(ManyToManyRawIdWidget, self).__init__(rel, attrs) + def __init__(self, rel, attrs=None, using=None): + super(ManyToManyRawIdWidget, self).__init__(rel, attrs, using=None) def render(self, name, value, attrs=None): attrs['class'] = 'vManyToManyRawIdAdminField' diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py index cc6d7dfef8..1d0b5e7942 100644 --- a/django/db/models/fields/related.py +++ b/django/db/models/fields/related.py @@ -284,7 +284,9 @@ class ReverseSingleRelatedObjectDescriptor(object): elif value is not None and value._state.db != instance._state.db: if instance._state.db is None: instance._state.db = value._state.db - else: + elif value._state.db is None: + value._state.db = instance._state.db + elif value._state.db is not None and instance._state.db is not None: raise ValueError('Cannot assign "%r": instance is on database "%s", value is is on database "%s"' % (value, instance._state.db, value._state.db)) @@ -782,10 +784,10 @@ class ForeignKey(RelatedField, Field): self.rel.field_name = cls._meta.pk.name def formfield(self, **kwargs): + db = kwargs.pop('using', None) defaults = { 'form_class': forms.ModelChoiceField, - 'queryset': self.rel.to._default_manager.complex_filter( - self.rel.limit_choices_to), + 'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to), 'to_field_name': self.rel.field_name, } defaults.update(kwargs) @@ -1030,9 +1032,10 @@ class ManyToManyField(RelatedField, Field): setattr(instance, self.attname, data) def formfield(self, **kwargs): + db = kwargs.pop('using', None) defaults = { 'form_class': forms.ModelMultipleChoiceField, - 'queryset': self.rel.to._default_manager.complex_filter(self.rel.limit_choices_to) + 'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to) } defaults.update(kwargs) # If initial is passed in, it's a list of related objects, but the