1

在庫システムを運営している人がいるとしましょう。各人にはいくつかの車があり、各車には非常に多くの部品があります(たとえば、数千)。

人のBobは、Djangoフォームを使用して車を作成します。次に、ボブはいくつかのパーツを作成します。Djangoがパーツが特定の車に属していること、およびParts.ForeignKey(Car)フィールドに選択できるのは特定の車のみであることを知っているのは、フォームレベルのみです。パーツを作成するときは、車の選択をボブが所有する車のみに制限するために、フォームのコンストラクターなどをいじる必要があります。

フォームレベルでこの所有権を強制することは、まったく適切または安全ではないようです。まず、他のユーザーの車には、車の所有者以外はアクセスできないようにする必要があるようです。現在、ソリッドフォームプログラミングのみが他の人の車を見ることができません!第二に、このようにコンストラクターを変更して問題を処理するのはお粗末なようです。あなたはこれについてどう思いますか、そしてこれを強制する方法はありますか?

4

1 に答える 1

1

まず第一に、これの一部は、現在のユーザーが誰であるかを知っているレベルで発生する必要があります。Djangoには、グローバルなrequest.userのようなものはないので、リクエストオブジェクトがある場合はこれを確認するか、パレメーターとして渡す必要があります。

求めていることを実現する1つの方法は、カスタムマネージャーを使用することです。車のクラスでは、

class CarManager(models.Manager):
    def for_user(self, user):
        return super(CarManager, self).get_query_set().filter(creator=user)

また、デフォルトのマネージャーとそのデフォルトのメソッドをオーバーライドして、このメソッドのみを許可することもできます。

2番目の部分では、コンストラクターを変更する必要はありません。気に入らない場合は、他の方法があります。ただし、それらを変更することで、たとえば、ログに記録されたユーザーなしでフォームを作成することはできません。もう1つの方法は、ModelChoiceFieldを使用して、ビュー内のクエリセット属性をオーバーライドすることです。

form.car.queryset = Car.objects.for_user(request.user)

ただし、このアプローチではエラーが発生しやすくなります。次のようにフォームコンストラクタを変更する必要があります。

class PartForm(forms.ModelForm):
    def __init__(self,user,*args,**kwargs):
        super (PartForm,self ).__init__(*args,**kwargs)
        self.fields['car'].queryset = Car.objects.for_user(user)

お役に立てれば。

于 2010-05-04T12:44:52.073 に答える