【问题标题】:How to fill value in a limit_choices_to option in OneToOneField for Django Admin?如何在 Django Admin 的 OneToOneField 中的 limit_choices_to 选项中填充值?
【发布时间】:2015-08-21 18:53:44
【问题描述】:

我需要限制 Django Admin 表单中的选择,但无法提出解决方案。鉴于这些模型:

class ProductFamily(models.Model):
    name = models.CharField(max_length=250)
    default_product_to_display = models.OneToOneField('Product', limit_choices_to={'product_family': ??????}) 
    # Enclosing Product reference in quotes is necessary since the Product declaration is below ProductFamily declaration

class Product(models.Model):
    name = models.CharField(max_length=250)
    image = models.ImageField(upload_to='images/',blank=True,null=True)
    product_family = models.ForeignKey(ProductFamily)

应该在 ProductFamily 类的 ?????? 中放置什么?我已经尝试了所有我能想到的方法,包括名称、“名称”ProductFamily、“产品系列”、self、self.id。带有 self 的选项返回内部服务器错误。引用的选项返回:'int() 的无效文字'。当“name”不带引号使用时,它返回: int() 参数必须是字符串或数字,而不是 'CharField'。
如果我输入一个硬编码的整数值来测试它,那么它工作正常,所以它显然在寻找一个整数价值。 我也尝试过,但没有成功,将两者都放置 id = models.AutoField(primary_key=True) 在 ?????? 的 id 声明中,以及定义一个返回 self.id 的函数,但这些都不起作用。

那么 - 我如何通过仅显示那些 product_family id 与当前 ProductFamily 匹配的产品来限制产品的选择?

【问题讨论】:

    标签: django python-2.7 django-admin


    【解决方案1】:

    最好的方法是使用自定义表单来限制字段的查询集,因为尝试动态设置limit_choices_to 非常困难,如果不是完全不切实际的话。

    例子:

    class ProductFamilyForm(forms.ModelForm):
    
        def __init__(self *args, **kwargs):
            if 'initial' in kwargs:
                self.fields['default_product_to_display'].queryset = Product.objects.filter(
                    product_family=initial.product_family)
    

    【讨论】:

    • 非常感谢。差不多了,但是“initial.product_family”不起作用。以下是最终奏效的方法:class ProductFamilyForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(ProductFamilyForm, self).__init__(*args, **kwargs) self.fields['default_product_to_display'].queryset = Product.objects.filter(product_family=self.instance.pk) class ProductFamilyAdmin(admin.ModelAdmin): form = ProductFamilyForm list_display = ('id','name','category','default_product_to_display',) list_filter = ('category',)
    • 当然不是 :) 这是一个伪代码示例,供您提供自己的价值。
    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2011-09-25
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多