モデルにorder
、その種類のすべてのアイテムの中でアイテムの順序を含むフィールドが必要です。
そして、そのテーブルに現在存在するアイテムのすべての数を含むchoices
その内で使用したいと思います。IntegerField
したがって、動的な選択である必要があります。
テーブル内の既存のすべてのアイテムの既存の「順序」値をすべてロードし、このリストを選択に使用するにはどうすればよいですか?
モデルにorder
、その種類のすべてのアイテムの中でアイテムの順序を含むフィールドが必要です。
そして、そのテーブルに現在存在するアイテムのすべての数を含むchoices
その内で使用したいと思います。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
管理者でもこのフィールドを上書きします。