limit_choices_to 的 Django 抽象模型覆盖方法
Posted
技术标签:
【中文标题】limit_choices_to 的 Django 抽象模型覆盖方法【英文标题】:Django abstract model override method for limit_choices_to 【发布时间】:2016-05-13 00:34:42 【问题描述】:这是我的模型:
class BudgetName(model.Models):
name = models.CharField(max_length=150)
type = models.IntegerField(default=0,choices=((0,'incomes'),(1,'outcomes')))
class FinancialModel(models.Models):
class Meta:
abstract = True
def my_limit_choices():
return None
""" Here goes some price fields, not important here """
budgetname = models.ForeignKey(BudgetName, limit_choices_to= my_limit_choices)
class Incomes(FinancialModel):
def my_limit_choices():
return 'type':0
class Outcomes(FinancialModel):
def my_limit_choices():
return 'type':1
它在抽象类中运行良好 - 当我尝试在 my_limit_choices 方法中过滤某些内容时。但是,似乎它们没有在子类中被覆盖。为什么以及如何解决这个问题?
【问题讨论】:
不,没关系。否则会抛出:my_limit_choices() takes exactly 1 argument (0 given)
.
【参考方案1】:
不能让limit_choices_to
调用实例方法my_limit_choices
。
另一种方法是定义一个自定义模型表单,并在__init__
方法中设置查询集。
class FinancialModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyOrderForm, self).__init__(*args, **kwargs)
self.fields['budgetname'].queryset = BudgetName.objects.filter(**self.instance.my_limit_choices())
然后在您的模型管理员中使用此表单:
class IncomesAdmin(admin.ModelAdmin):
form = FinancialModelForm
class OutcomesAdmin(admin.ModelAdmin):
form = FinancialModelForm
admin.site.register(Incomes, IncomesAdmin)
admin.site.register(Outcomes, OutcomesAdmin)
【讨论】:
以上是关于limit_choices_to 的 Django 抽象模型覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章
Django ForeignKey.limit_choices_to 与 ForeignKey to ManyToMany 场景