django - inline - Search for existing record instead of adding a new one

前端 未结 1 1021
攒了一身酷
攒了一身酷 2021-02-07 13:55

I have a library with shelves and books. I point each book to one shelf in a one-to-many relationship. If a book is pointing to a Null it means that it\'s in the li

1条回答
  •  挽巷
    挽巷 (楼主)
    2021-02-07 14:20

    Hi the following code worked for me:

    from widgets import ImproveRawIdFieldsForm
    
    class BookInline(admin.TabularInline):
        model = Book
        raw_id_fields=('shelf',)
        extra =1
    class 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.py
    class Book(models.Model):
        shelf = models.ForeignKey(Shelf, blank=True, null=True, related_name="in_shelf")
    
    #admin.py
    class 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
    

    0 讨论(0)
提交回复
热议问题