【问题标题】:django - inline - Search for existing record instead of adding a new onedjango - 内联 - 搜索现有记录而不是添加新记录
【发布时间】:2014-09-21 14:32:21
【问题描述】:

我有一个有书架和书籍的图书馆。我以一对多的关系将每本书指向一个书架。如果一本书指向Null,则表示它在图书馆中,但尚未在书架上。

#models.py

class Shelf(models.Model):
    pass

class Book(models.Model):
    shelf = models.ForeignKey(Shelf, blank=True, null=True)

然后:

#admin.py

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

class Shelf(admin.ModelAdmin):
    inlines = [ BookInLine, ]

当我编辑书架时,我可以查看和修改该书架中的所有书籍。

问题:

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

【问题讨论】:

    标签: python django django-admin inline


    【解决方案1】:

    您好,以下代码对我有用:

    from widgets import ImproveRawIdFieldsForm
    
    class BookInline(admin.TabularInline):
        model = Book
        raw_id_fields=('shelf',)
        extra =1
    class Shelf(ImproveRawIdFieldsForm):
        inlines = [BookInline,]
    

    它创建了一个管理视图,您可以在其中设置普通的 Shelf 内容和作为原始 id 字段的附加内联,并且您可以添加新的关系,您可以使用“放大镜”图标从现有对象中进行选择,其中会弹出所有现有书籍的列表。除了在弹出窗口中选择一本书外,您还可以在那里创建新书。因此,据我了解,这可以解决您的所有要求

    这里解释了这个问题的更好解决方案:one-to-many inline select with 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
    

    【讨论】:

    • 我收到错误:'ReverseSingleRelatedObjectDescriptor' object has no attribute 'through'
    • 另外,如果我设置为model = Book,则会出现错误:'BookInLine.raw_id_fields' refers to field 'book' that is missing from model 'myapp.Book'
    • 感谢@gaw 它适用于第二个选项。虽然需要很多事情来解决......我会将其标记为已回答。但是没有任何选项可以通过弹出窗口或类似的方式将“添加另一本书”更改为“附加另一本书”吗?对用户来说会更容易和方便。谢谢!
    • ImprovRawIdFieldsForm 从何而来?我也在寻找与 Eric 完全相同的解决方案。 “附加另一本书”而不是“添加另一本书”
    猜你喜欢
    • 2023-01-12
    • 2012-07-25
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2017-12-24
    • 2012-09-29
    • 2014-12-16
    相关资源
    最近更新 更多