我希望我的模型有order
字段,它将包含所有同类项目中的项目顺序。
我想choices
在 that中使用IntegerField
,它将包含该表中当前存在的项目的所有数量。
所以它需要是动态的选择。
如何加载表中所有现有项目的所有现有“订单”值,并使用此列表进行选择?
我希望我的模型有order
字段,它将包含所有同类项目中的项目顺序。
我想choices
在 that中使用IntegerField
,它将包含该表中当前存在的项目的所有数量。
所以它需要是动态的选择。
如何加载表中所有现有项目的所有现有“订单”值,并使用此列表进行选择?
听起来你想为你的模型建立一个管理器:
from django.db import models
class OrderManager(models.Manager):
def order_choices(self):
return [(i, i) for i in OrderModel.objects.values_list('order', flat=True)]
class OrderModel(models.Model):
objects = OrderManager()
order = models.IntegerField()
class Meta:
ordering = ['order']
def __unicode__(self):
return '%i' % self.order
from django import forms
from yourapp.models import OrderModel
class OrderModelForm(forms.ModelForm):
order = forms.ChoiceField(choices=OrderModel.objects.order_choices())
class Meta:
model = OrderModel
from django.contrib import admin
from yourapp.forms import OrderModelForm
from yourapp.models import OrderModel
class OrderModelAdmin(admin.ModelAdmin):
form = OrderModelForm
admin.site.register(OrderModel, OrderModelAdmin)
管理器用于在没有模型对象实例的情况下进行一般模型查询。如果您不了解管理器的概念,您仍然可以从管理器类中重构代码,将其粘贴到其他地方并在您的代码中导入该函数。管理器允许您抽象出可以重用的自定义通用查询集。查看更多详细信息https://docs.djangoproject.com/en/dev/topics/db/managers/
没有经理的代码看起来像
from app.models import OrderModel
def order_choices():
return [(i, i) for i in OrderModel.objects.values_list('order', flat=True)]
从代码中的任何位置,如果您想多次重用上述内容:
from app.views import oder_choices
order_choices()
相对于:
from app.models import OderModel
OrderModel.objects.order_choices()
如果您只想使用上述一次,则可以将其保留在forms.py
另一个答案中。如何重构代码完全取决于您。
不要将选项直接添加到模型中,稍后通过使用一组选项覆盖字段来将它们添加到代表模型的表单中。
比,做类似的事情:
class MyForm(..):
myfield_order_field = IntegerField(choices = [(i,i) for range(MyModel.objects.count)])
class Meta():
model = MyModel
如果您想在管理员中使用它,请添加到您的管理员类:
class MyModelAdmin(admin.ModelAdmin):
...
form = MyForm
它也将覆盖管理员中的此字段。