django - inline - 搜索现有记录而不是添加新记录

Eri*_*cPb 13 python django inline django-admin

我有一个带书架和书籍的图书馆.我将每本书以一对多的关系指向一个书架.如果一本书指向Null它意味着它在库中,但尚未在书架中.

#models.py

class Shelf(models.Model):
    pass

class Book(models.Model):
    shelf = models.ForeignKey(Shelf, blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

然后:

#admin.py

class BookInLine(admin.TabularInLine):
    model = Book
    extra = 0

class Shelf(admin.ModelAdmin):
    inlines = [ BookInLine, ]
Run Code Online (Sandbox Code Playgroud)

当我编辑书架时,我可以看到并修改该书架中的所有书籍.

问题:

  • 我已经在图书馆里有很多书(指向Null).
  • 如果我从内联中单击"添加另一本书",它将创建一本全新的书.但我想避免这种情况.我想从已经在图书馆但不属于任何书架的书籍中进行选择.

gaw*_*gaw 7

您好以下代码为我工作:

from widgets import ImproveRawIdFieldsForm

class BookInline(admin.TabularInline):
    model = Book
    raw_id_fields=('shelf',)
    extra =1
class Shelf(ImproveRawIdFieldsForm):
    inlines = [BookInline,]
Run Code Online (Sandbox Code Playgroud)

它创建了一个管理视图,您可以在其中查看正常的Shelf内容和附加内联,这是一个原始id字段,您可以添加新的关系,并且您可以使用"放大镜"图标从现有对象中进行选择,从而产生弹出所有现有书籍的列表.除了在弹出窗口中选择一本书,您还可以在那里创建新书.因此,根据我的理解,这可以解决您的所有要求

这里解释了这个问题的更好解决方案:使用django admin进行一对多内联选择

为您的用例编辑:

#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
Run Code Online (Sandbox Code Playgroud)

  • ImproveRawIdFieldsForm来自哪里?我也在寻找与Eric完全相同的解决方案."附上另一本书"而不是"添加另一本书" (3认同)