我有一个带书架和书籍的图书馆。我将每本书以一对多的关系指向一个书架。如果一本书指向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
)。答案 0 :(得分:7)
以下代码适用于我:
from widgets import ImproveRawIdFieldsForm
class BookInline(admin.TabularInline):
model = Book
raw_id_fields=('shelf',)
extra =1
class Shelf(ImproveRawIdFieldsForm):
inlines = [BookInline,]
它会创建一个管理视图,您可以在其中查看正常的货架内容和附加的内联,这是一个原始的id字段,您可以添加新关系,您可以使用"放大镜&#从现有对象中进行选择34;图标,弹出所有现有图书的列表。除了在弹出窗口中选择一本书,您还可以在那里创建新书。因此,根据我的理解,这将解决您的所有要求
此处解释了针对此问题的更好解决方案: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