簡體   English   中英

Django-如何在管理頁面上的表格的可編輯列中過濾ForeignKey選擇?

[英]Django - how do I filter ForeignKey choices in an editable column in a table on the admin page?

我的models.py包含以下內容:

class Size(models.Model):
    size = models.CharField(max_length=20, primary_key=True)

class Book(models.Model):
    title = models.CharField(max_length=100, primary_key=True)
    size = models.ForeignKey(Size, null=False)

class Pamphlet(models.Model):
    title = models.CharField(max_length=100, primary_key=True)
    size = models.ForeignKey(Size, null=False)
    book = models.ForeignKey(Book, null=True)

最初構建數據庫時,將填充Size,Book和Pamphlet表,並且每個Book和Pamphlet都與一個單一大小相關聯。 但是,未設置從Pamphlet到Book的外鍵。

用戶有責任進入管理頁面並選擇與每本小冊子相關的書。 Django的管理功能使將顯示的表中的此列設置為可編輯成為可能,並且它足夠聰明,可以自動生成一個下拉選項,以顯示books表中所有可能的書籍供用戶選擇。

但是,該書表包含數百種選擇,並且我知道只有用戶選擇與小冊子大小相同的書才有意義。 因此,我想過濾Django生成的下拉列表中的選項,僅顯示與小冊子大小相同的書籍。

我該怎么做?

我在這里查看: 如何在Django ModelForm中過濾ForeignKey選擇? 但這似乎並不是指Django的Admin功能。

專門化管理員的get_changelist_form方法以返回自定義表單類。 該表單類可以根據其接收的instance參數在其__init__方法中設置其book字段的queryset屬性。 例如:

class PamphletChangeListForm(forms.ModelForm):
    class Meta:
        model = Pamphlet

    def __init__(self, *args, **kwargs):
        super(PamphletChangeListForm, self).__init__(*args, **kwargs)
        instance = kwargs.get('instance')
        if instance:
            self.fields['book'].queryset = Book.objects.filter(size=instance__size)

暫無
暫無

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

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