2

この質問は、「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'生成フォームの属性を変更する方法はわかりません。

別のオプションは、フォームのドロップダウンリストのオプションを制限することですが、その方法もわかりません。

さまざまな観点からのアドバイスは大歓迎です。

答えて

2

コードを見ると、編集ビューはfields属性の値に基づいてget_form_class内にフォームを生成します。これはクラス属性として定義されていますが、実際にコードでself.fieldsを参照しているため、インスタンスレベルでオーバーライドできない理由はありません。

+0

が良さそうだ

class SetCreate(LoginRequiredMixin, CreateView): model = Set fields = ('name', 'matter', 'group') def get_form_class(self, *args, **kwargs): if self.request.user.has_the_right_permission(): self.fields += ('teacher',) else: self.fields = self.fields return super(SetCreate, self).get_form_kwargs(*args, **kwargs) 

が、それは、唯一の編集フォームのために有用ではない作成します(一見無意味なelseブロックは、我々は常にインスタンス変数を設定を確認することです。):だから、あなたはこれを行うことができます形。作成モードでは、通常のユーザーは実際には「教師」フィールドを定義しますが、自分自身としてのみ定義します。理想的には、フォームが生成された時点で「教師」フィールドに「無効」属性を設定するだけで解決できますが、そのためにどのような方法を上書きするかわかりません。 – jjchico

+0

これは、上で示した 'form_valid'コードで行います。また、権限をチェックするifブロックの内部にあります。 –

関連する問題