0

モデルにorder、その種類のすべてのアイテムの中でアイテムの順序を含むフィールドが必要です。

そして、そのテーブルに現在存在するアイテムのすべての数を含むchoicesその内で使用したいと思います。IntegerField

したがって、動的な選択である必要があります。

テーブル内の既存のすべてのアイテムの既存の「順序」値をすべてロードし、このリストを選択に使用するにはどうすればよいですか?

4

2 に答える 2

3

モデルのマネージャーを構築したいようです:

models.py

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

フォーム.py

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

admin.py

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/

マネージャーなしのコードは次のようになります

views.py またはその他のファイル

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、他の回答に示されているようにそのままにしておくことができます。コードをどのようにリファクタリングするかは、あなた次第です。

于 2012-12-23T15:33:34.650 に答える
1

選択肢をモデルに直接追加しないでください。フィールドを選択肢のセットでオーバーライドすることにより、後でモデルを表すフォームに選択肢を追加してください。

より、次のようなことを行います。

class MyForm(..):
    myfield_order_field = IntegerField(choices = [(i,i) for range(MyModel.objects.count)])
    class Meta():
        model = MyModel

管理者で使用する場合は、管理者クラスに追加します。

class MyModelAdmin(admin.ModelAdmin):
...

    form = MyForm

管理者でもこのフィールドを上書きします。

于 2012-12-23T10:15:02.017 に答える