私はかなり基本的なものを達成しようとしていますが、解決策を見つけることができません。クラスベースのビュー、フォームにデータを追加
私は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とモデルの間でデータをやりとりする方法についての情報はありますか?
こんにちは。あなたの答えをありがとう、それは動作しますが、私はどのようにform.save()なしでユーザーオブジェクトを取得するはずですか?また、アクセス権を追加または削除する前に、ユーザー情報が実際には大丈夫であることを確認する方法はありますか? – Linio
あなたは 'user = self.object'でユーザを得ることができます - それはまだ更新された詳細を持っていませんが、あなたのやっていることはすべて追加/削除です。 'commit = False'でsaveを呼び出すと、フォームに多対多のフィールドがあり、' save_m2m'を呼び出さなかった場合に問題が発生する可能性があります。あなたのケースでは、多対多フィールドはありませんが、将来の読者が巻き込まれることを望んでいませんでした。 – Alasdair
フォームの2番目の質問として、あなたは 'form_valid'メソッドに入っているので情報が実際にはOKであることを知っています。フォームデータが無効な場合、ビューは代わりに 'form_invalid'を呼び出します。 – Alasdair