簡體   English   中英

django - inline - 搜索現有記錄而不是添加新記錄

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

我有一個帶書架和書籍的圖書館。 我將每本書以一對多的關系指向一個書架。 如果一本書指向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 )。
  • 如果我從內聯中單擊“添加另一本書”,它將創建一本全新的書。 但我想避免這種情況。 我想從已經在圖書館但不屬於任何書架的書籍中進行選擇。

您好以下代碼為我工作:

from widgets import ImproveRawIdFieldsForm

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

它創建了一個管理視圖,您可以在其中查看正常的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM