2009-08-06 11 views
3

私はm2mフィールドユーザを持つProjectという名前のモデルを持っています。私はFKプロジェクトのタスクモデルを持っています。それにはフィールドが割り当てられています。 assigned_toの選択肢を現在のプロジェクトのユーザだけに制限するにはどうしたらよいですか?制限の選択

答えて

0

custom form for the adminを作成する必要があります。

フォームにはModelChoiceFieldが含まれていなければなりません。利用可能な選択肢を定義するクエリーセットパラメータを指定できます。このフォームはです。はModelFormです。

(以下の例では、ユーザーがあなたのプロジェクトのモデルにFKを持っていると仮定し)

forms.py

from django import forms 

class TaskForm(forms.ModelForm): 
    assigned_to = forms.ModelChoiceField(queryset=Users.objects.filter(user__project=project)) 

    class Meta: 
     model = Task 

その後ModelAdminのにフォームを割り当てます。

admin.py

from django.contrib import admin 
from models import Task 
from forms import TaskForm 

class TaskAdmin(admin.ModelAdmin): 
    form = TaskForm 
admin.site.register(Task, TaskAdmin) 
+0

def make_task_form(project): class _TaskForm(forms.Form): assigned_to = forms.ModelChoiceField( queryset=User.objects.filter(user__project=project)) class Meta: model = Task return _TaskForm 

は、その後、あなたのビューコードから、あなたはこのような何かを行うことができます。しかし、私のプロジェクトモデルにはM2Mフィールドユーザがいます。 – swoei

+2

アイデアは正しいものですが、 'project'変数が定義されていないので、与えられたコードは機能しません。クエリセットパラメータの右側は、モデル上のフィールドではなく、実際の値または変数でなければなりません。実際にはフォームの '__init__'メソッドをオーバーライドしてこれを動作させる必要があります。 –

1

あなたは、この気の利いたフォームの工場のトリックを使用して、別の方法でこれを行うことができます。私のユーザーは私のプロジェクトのモデルにFKを持っていない

project = Project.objects.get(id=234) 
form_class = make_task_form(project) 
... 
form = form_class(request.POST) 
関連する問題