2016-04-19 1 views
0

クリスピーフォームを使用している間は何か簡単にしたいです。ユーザーがスタッフグループに所属している場合にのみ、Fieldsetを表示する必要があります。これは、簡単にこのような標準的なテンプレートで解決されていますクリスピーフォームを使用してフィールドセットを条件付きで表示する

{% if user.is_staff %} show extra stuff {% endif %}

たぶん私は手動で何かを逃したが、私はuser.is_staff場合、私はちょうど「{%のようなテンプレートタグを挿入することができますどのように表示されません%} "をクリスピーフォームにレイアウトします。

self.helper.layout = Layout(
    Fieldset(
     'Section One', 
     'name', 
     'description', 
    ), 
    Djangotag('{% if user.is_staff %}'), 
    Fieldset(
     'Conditional Fieldset', 
     'field1', 
     'field2', 
    ), 
    Djangotag('{% endif %}'),  
    Fieldset(
     'More Details', 
     'detail1', 
     'detail2', 
    ), 
) 

クリスピーフォームでこれを行う簡単な方法があります:私は私の問題を解決するために架空の「Djangotag」を使うところ、以下のようなものをすることができれば、私のユースケースのための理想的なのでしょうか?


注:私はすでにself.user = kwargs.pop('user')アプローチを実装し、それは非常にエレガントではないですが、私はまだ良い何かを探しています。

私はまた、ifステートメント用に作成された単純なテンプレートを試してみましたが、これを試しました。HTML("{% include 'helpers/is_staff.html' %}"),しかし、レンダリングプロセスは失敗します。

答えて

2

フォームから要求コンテキストをビューから渡して、これをフォームヘルパーで使用することができます。フォームのレイアウトコードで

def __init__(self, *args, **kwargs): 
    self.user = kwargs.pop('user', None) 
    super(MyForm, self).__init__(args, kwargs) 

そして最後に:

if user and user.is_staff: 
    self.helper.layout.append(Fieldset(
     'Conditional Fieldset', 
     'field1', 
     'field2', 
    ), 
フォームの __init__方法で次に

form = MyForm(request.POST, user=getattr(request, 'user', None)) 

:フォームを作成ビュー機能で

:このような何か

私はこのフィールドセットをレイアウトの最後に追加しました。 documentationには、レイアウトを即時に更新するための他のオプションがあります。

+0

これは私が実装し始めた正確なアプローチです。そして、フィールドとウィジェットなどを追加することで、私は周りを猿で囲む必​​要があることに気付きました.Djangoフレームワークは、このような使い方を非常にエレガントに解決します。このハックは醜く高速になり、動作しますが、受け入れられないようです。 – eezis

0

私はよりクリーンな方法を見つけることができませんでしたので、開始した方法で完了しました。 ModelFormサブクラスで

ここでビューだ...

class ModelCreateView(LoginRequiredMixin, CreateView): 
.... 
def get_form_kwargs(self): 
    # I am going to stuff the user object into the view so that 
    # I can use it in ModelForm to check the user and build the form 
    # conditionally 
    kwargs = super(ModelCreateView, self).get_form_kwargs() 
    kwargs.update({'user': self.request.user}) 
    return kwargs 

それはフィールドが常に必要とされたと仮定するのが最も簡単だった - ので、私は、メタセクションでそれらのすべてを宣言した - その後、条件付きでフィールドを削除し、条件付きでフォームを追加してください。

削除が途中であることを認識するのにしばらく時間がかかりました。誰かを助けることを願っています。

関連する問題