16

私はdjango-cmsの初心者です。チュートリアルを完了し、ドキュメントに記載されているのとまったく同じように構成しました。ここで、フォームを使用して製品をアップロードするアプリケーションを作成する必要があります。

私はそれをどのように進めるかについての手がかりを持っていません。たとえば、ユーザー名とパスワードのテキストボックスのような単純なフォームから始めたいと思います。django-cms ページで django フォームを使用するにはどうすればよいですか? スニペットプラグインも有効にしています。このためのガイダンスが必要です。

任意の提案plsss。ありがとう

4

6 に答える 6

15

プラグインで request.POST を使用すると、非常に悪い副作用が発生する可能性があるため、bennylope によって提案されたソリューションは実際には推奨される方法ではありません (たとえば、同じプラグインがページに 2 回ある場合はどうなるでしょうか? または複数のプラグインが待機している場合はどうなるでしょうか?同じページの POST データの場合? そのページへの POST があると、これらのプラグインは互いに混乱します)。

したがって、推奨される方法は次のとおりです。

  • bennylopeで説明されているように、CMSPlugin を作成して、フォームをレンダリングします。
  • フォームを静的にフックされたビュー (またはアプリフックされたビュー) に投稿します。POST が成功した場合は、必要に応じてページに再度リダイレクトします。
于 2011-03-26T17:52:07.223 に答える
6

私もdjango-cmsは初めてですが、回答で説明されている方法が最も合理的です。

  • 上記のようにCMSPluginを作成して、フォームをレンダリングします。
  • フォームを静的にフックされたビュー (またはアプリフックされたビュー) に投稿します。POST が成功した場合は、必要に応じてページに再度リダイレクトします。

ただし、成功した場合だけでなく、表示する必要があるフォームエラーの場合にも、プラグインを含む cms ページにリダイレクトしたいため、これは部分的な解決策にすぎません。リダイレクト部分は問題ではありません (request.META["HTTP_REFERER"] にリダイレクトするだけです) が、フォーム (エラー) をプラグインを含む cms ページに渡す部分は注意が必要です。これに対して私が見つけた唯一の答えは、セッションを使用することです (静的ビューでフォームをセッションに書き込み、プラグインの render メソッドで再度削除します)。最も良い方法ではありませんが、うまくいきます。(cms プラグイン構成がレンダリングの代わりにリダイレクトする何らかの方法をサポートする場合、より良い方法がありますが、明らかにそのようなオプションはありません: を参照してください。http://groups.google.com/group/django-cms/browse_thread/thread/79ab6080c80bbcb5 )

于 2011-05-17T11:39:19.767 に答える
6

製品アプリケーションが Django CMSなしで期待どおりに動作すると仮定すると、次に行うことは、フォームを表示する独自のプラグインを作成することです。プラグインは、作成したプラグイン テンプレートを使用して独自のアプリケーションで既に定義したフォームをレンダリングします。

お問い合わせフォーム用のこのプラグインを使用すると、プレースホルダーが許可する場所ならどこでも、お問い合わせフォームをページ テンプレートに挿入できます。

class ContactPlugin(CMSPluginBase):
    """Enables latest event to be rendered in CMS"""

    model = CMSPlugin
    name = "Form: Contact"
    render_template = "contact_form/contact_plugin.html"

    def render(self, context, instance, placeholder):
        request = context['request']
        context.update({
            'instance': instance,
            'placeholder': placeholder,
            'form': ContactForm(request=request),
        })
        return context

テンプレートには、フォームのレンダリングに必要なすべての HTML および Django テンプレート言語が含まれます。

この他のお問い合わせフォーム プラグインは、その方法の別の例を示しています。フォームをレンダリングする代わりに、コンテキストを更新するだけです。利点は、別のテンプレートを作成する必要がないことですが、欠点は、プラグインのモジュール性が失われることです。これは、フォームをレンダリングするページ テンプレートによって異なります。

class ContactPlugin(CMSPluginBase):
    model = Contact
    name = _("Contact Form")
    render_template = "contact.html"

    def render(self, context, instance, placeholder):
        request = context['request']

         if request.method == "POST":
            form = ContactForm(request.POST)
            if form.is_valid():
                form.send(instance.site_email)
                context.update( {
                    'contact': instance,
                    })
            return context
        else:
            form = ContactForm()

            context.update({
            'contact': instance,
            'form': form,
            })
            return context

どちらの場合でも、フォームの送信を受け入れるようにビューを定義する必要があります。つまり、独自のテンプレートを使用してフォームの受信を確認し、ユーザーを参照ページにリダイレクトして、CMS の外部にビューを作成する必要があります。 /または AJAX リクエストを受け入れる。

于 2011-03-26T16:20:16.597 に答える
5

私は最近、django-form-designerに出くわしました

これは非常に優れており、フォームを wysiwyg 方式で設計できます。スタンドアロンの Django アプリケーションで動作し、Django-CMS 用の追加のプラグインがあります。1 つの注意: Django-CMS のインストール手順に加えて、スタンドアロンの手順に従う必要があります。

github の説明から:

主な機能:

  • コードを書くことなく、Django 管理者から連絡先フォーム、検索フォームなどを設計します
  • フォーム データをログに記録して CSV エクスポートしたり、電子メールで送信したり、任意の Web アドレスに転送したりできます
  • Django CMS との統合: 任意のページにフォームを追加
  • ドラッグ アンド ドロップを使用して、フォーム フィールドの位置を変更します
  • フォームの全体像を把握するための完全に折りたたみ可能な管理インターフェース
  • Django に含まれる多くのフォーム フィールド (TextField、EmailField、DateField など) を実装します。
  • Django が提供する検証ルールは完全に設定可能です (最大長、正規表現など)。
  • カスタマイズ可能なメッセージとラベル
  • POST および GET フォームをサポート
于 2012-01-29T03:18:51.073 に答える
1

例外をスローしてミドルウェアでキャッチすることで回避できます: http://djangosnippets.org/snippets/2541/

于 2011-09-06T18:28:28.760 に答える