2016-05-25 18 views
1

私はかなり基本的なものを達成しようとしていますが、解決策を見つけることができません。クラスベースのビュー、フォームにデータを追加

私はdjangoアプリケーションでユーザーを作成して更新するためのかなり一般的なビューを作成しています。私は、関連する権限を持つ「プロバイダ」モデルを持っています。私は非常に簡単な方法で権利管理を追加したいと思っています。フォームを表示すると、ユーザーが追加/削除/変更権限を持っているかどうかをチェックする必要があります。一方、チェックボックスをオンにすると、データベースに権限を設定する必要があります。

それはこのように書き:

class UserUpdate(UpdateView): 
    form_class = UserForm 
    model = User 

    def get_initial(self): 
     user = self.get_object() 
     if user is not None and user.has_perm('core.add_provider'): 
      return { 'right_provider' : True } 

    def form_valid(self, form): 
    user = form.save(commit=False) 

    if form.right_provider: 
     user.user_permissions.add('core.add_provider', 'core.change_provider', 'core.delete_provider') 
    else: 
     user.user_permissions.remove('core.add_provider', 'core.change_provider', 'core.delete_provider') 
    return super().form_valid(form) 

次にフォーム:'ユーザーフォーム' オブジェクトが

'right_provider' は属性を持っていないので

class UserForm(ModelForm): 

    right_provider = BooleanField(label='Right Provider', required=False) 

    class Meta: 
     model = User 
     fields = ['username', 'email', 'first_name', 'last_name'] 

は、どうやらそれは、それを行う方法はありません

私は正しいことをしていますか?あれば、このコードの問題は何ですか? ModelFormとモデルの間でデータをやりとりする方法についての情報はありますか?

答えて

2

フォームのcleaned_dataから値を取得できます。

def form_valid(self, form): 
    if form.cleaned_data['right_provider']: 
     ... 
    else: 
     ... 
    return super().form_valid(form) 

def form_valid(self, form): 
    if form.cleaned_data['right_provider']: 
     ... 
    else: 
     ... 
    return super().form_valid(form) 

注私はsave()コールを削除した - あなたはsuper()を呼び出すとき、フォームが自動的に保存されます。

ビューで保存を呼び出す必要がある場合は、super()に電話をかけないでください。私はそれがより明確であると思うし、save_m2mという潜在的な問題は避けられている。詳細については、save methodフォームのドキュメントを参照してください。

def form_valid(self, form): 
    user = form.save(commit=False) 
    ... 
    user.save() # save the user to the db 
    form.save_m2m() # required if the form has m2m fields 
    return HttpResponseRedirect(self.get_success_url()) 

別のオプションは、その後、帰国せずに、第1 super()を呼び出すself.objectにアクセスし、そして最終的に応答を返すことです。

def form_valid(self, form): 
    response = super().form_valid(form) 
    user = self.object 
    if form.cleaned_data['right_provider']: 
     ... 
    else: 
     ... 
    return response 
+0

こんにちは。あなたの答えをありがとう、それは動作しますが、私はどのようにform.save()なしでユーザーオブジェクトを取得するはずですか?また、アクセス権を追加または削除する前に、ユーザー情報が実際には大丈夫であることを確認する方法はありますか? – Linio

+0

あなたは 'user = self.object'でユーザを得ることができます - それはまだ更新された詳細を持っていませんが、あなたのやっていることはすべて追加/削除です。 'commit = False'でsaveを呼び出すと、フォームに多対多のフィールドがあり、' save_m2m'を呼び出さなかった場合に問題が発生する可能性があります。あなたのケースでは、多対多フィールドはありませんが、将来の読者が巻き込まれることを望んでいませんでした。 – Alasdair

+0

フォームの2番目の質問として、あなたは 'form_valid'メソッドに入っているので情報が実際にはOKであることを知っています。フォームデータが無効な場合、ビューは代わりに 'form_invalid'を呼び出します。 – Alasdair

0

モデルフォームでは、フォームフィールドがモデルフィールドと一致する必要があります。つまり、モデルにフィールドとして追加することができます。

フォームのフィールドのみを使用する場合は、innitフォームのフィールドに追加します。

class UserFrom(ModelForm) 

    def __init__(self, **kwargs) 
     super(UserForm, self).__init__(**kwargs) 

     # probably some code here to work out the initial state of the checkbox, 
     self.fields['right_provider'] = forms.BooleanField(label='Right Provider', required=False) 
関連する問題