この質問は、「CreateView生成フォームの属性を変更するにはどうしたらいいですか?DjangoのCreateViewでフォームフィールドを無効にする
"CreateView"を使用して、Django 1.10でビューと関連するフォームを生成しています。アイデアは、通常のユーザー(教師)がモデルのインスタンスを自分でのみ作成できますが、特権ユーザーはインスタンスを作成して任意の教師に割り当てることができます。私は両方のために同じビュー/フォームを使用したいと思います。
モデル:
class Set(models.Model):
name = models.CharField(
max_length=40,
)
matter = models.ForeignKey(
Matter,
on_delete=models.SET_NULL,
null=True,
)
group = models.ForeignKey(
Group,
on_delete=models.SET_NULL,
null=True,
)
teacher = models.ForeignKey(
Teacher,
on_delete=models.PROTECT,
)
技術的には、現在のユーザが特権でない限り、それは現在ログインしている「先生」でフォームを埋めるに構成され、フィールドを無効にします。私は現在、次のコードで初期値の設定を行っていますが、一般ユーザーが「先生」フィールドを変更するのを防ぐ方法はわかりません。
class SetCreate(LoginRequiredMixin, CreateView):
model = Set
fields = ('name', 'matter', 'group')
def form_valid(self, form):
form.instance.teacher = self.request.user.teacher
return super(SetCreate, self).form_valid(form)
それは素晴らしい作品が、私は、特権によって「先生のフィールドを編集するためにそれを使用することはできません。
class SetCreate(LoginRequiredMixin, CreateView):
model = Set
fields = ('name', 'matter', 'group', 'teacher')
def get_initial(self):
return {'teacher': self.request.user.teacher.id}
# code to limit 'teacher' field editing
私が試した別のオプションは次のように、右の「先生」でインスタンスを作成することですユーザー。
フィールドを形成するための 'Field.disable'属性が存在することは知っていますが、可能であれば、 'CreateView'生成フォームの属性を変更する方法はわかりません。
別のオプションは、フォームのドロップダウンリストのオプションを制限することですが、その方法もわかりません。
さまざまな観点からのアドバイスは大歓迎です。
が良さそうだ
がが、それは、唯一の編集フォームのために有用ではない作成します(一見無意味なelseブロックは、我々は常にインスタンス変数を設定を確認することです。):だから、あなたはこれを行うことができます形。作成モードでは、通常のユーザーは実際には「教師」フィールドを定義しますが、自分自身としてのみ定義します。理想的には、フォームが生成された時点で「教師」フィールドに「無効」属性を設定するだけで解決できますが、そのためにどのような方法を上書きするかわかりません。 – jjchico
これは、上で示した 'form_valid'コードで行います。また、権限をチェックするifブロックの内部にあります。 –