django - inline - Search for existing record instead of adding a new one
Hi the following code worked for me:
from widgets import ImproveRawIdFieldsFormclass BookInline(admin.TabularInline): model = Book raw_id_fields=('shelf',) extra =1class Shelf(ImproveRawIdFieldsForm): inlines = [BookInline,]
It creates an admin view where you will se the normal Shelf stuff and the additional inline which is a raw id field and you have the posssibility to add new relations and you can chose from existing objects with the "magnifier" icon, which results in a pop-up of a list of all existing books. Besides chose one Book in the pop-up you can also create new Books there. So from my understanding this solves all your requirements
a better solution for this problem is explained here: one-to-many inline select with django admin
edited for your use-case:
#models.pyclass Book(models.Model): shelf = models.ForeignKey(Shelf, blank=True, null=True, related_name="in_shelf")#admin.pyclass ShelfForm(forms.ModelForm): class Meta: model = Shelf books = forms.ModelMultipleChoiceField(queryset=Book.objects.all()) def __init__(self, *args, **kwargs): super(ShelfForm, self).__init__(*args, **kwargs) if self.instance: if self.instance.in_shelf: self.fields['books'].initial = self.instance.in_shelf.all() else: self.fields['books'].initial = [] def save(self, *args, **kwargs): instance = super(ShelfForm, self).save(commit=False) self.fields['books'].initial.update(shelf=None) self.cleaned_data['books'].update(shelf=instance) return instance