簡體   English   中英

如何在 django-cms 中使用表單?

[英]how to use forms in django-cms?

我絕對是 django-cms 的新手。 我已經完成了本教程並按照文檔中提到的方式對其進行了配置。 現在,我必須構建一個使用表單上傳產品的應用程序。

我不知道如何繼續前進。 我想以簡單的形式開始它,就像現在,比如說,一個用戶名和密碼文本框。 如何在 django-cms 頁面中使用 django 表單? 我也啟用了片段插件。 我需要一些指導。

任何建議請。 謝謝

實際上,bennylope 提出的解決方案並不是首選的方法,因為在插件中使用 request.POST 可能會產生非常糟糕的副作用(例如:如果同一個插件在頁面上出現兩次怎么辦?或者如果有多個插件在等待呢?對於同一頁面上的 POST 數據?當對該頁面進行 POST 時,這些插件會相互混淆)。

所以首選的方法是:

  • 按照 bennylope 的描述制作一個 CMSPlugin 來渲染表單。
  • 將表單發布到靜態掛鈎視圖(或掛接視圖),如果 POST 成功,如果需要,再次重定向到頁面。

假設您的產品應用程序在沒有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 請求。

我也是 django-cms 的新手,但 ojii在他們的回答中描述的方式似乎是最合理的:

  • 如上所述制作 CMSPlugin 以呈現表單。
  • 將表單發布到靜態掛鈎視圖(或掛接視圖),如果 POST 成功,如果需要,再次重定向到頁面。

然而,對我來說,這只是部分解決方案,因為我不僅想在成功的情況下重定向回包含插件的 cms 頁面,而且在需要顯示的表單錯誤的情況下。 重定向部分不是問題(我只是重定向回 request.META["HTTP_REFERER"]),但是將表單(錯誤)移交給包含插件的 cms 頁面的部分很棘手。 我為此找到的唯一答案:我使用會話(在靜態視圖中將表單寫入會話,然后在插件的渲染方法中再次刪除它)。 不是最好的方法,但它有效。 (會有更好的方法,如果 cms 插件配置支持某種重定向而不是渲染的方式,但顯然沒有這樣的選項:請參閱http://groups.google.com/group/django-cms/browse_thread/thread /79ab6080c80bbcb5 )

我最近遇到了django-form-designer

它非常好,可以讓您以所見即所得的方式設計表單。 適用於獨立的 django 應用程序,並有一個額外的 Django-CMS 插件。 一個注意事項:除了安裝 Django-CMS 說明外,您還必須遵循獨立說明。

來自 github 描述:

主要特點:

  • 從 Django 管理員設計聯系表單、搜索表單等,無需編寫任何代碼
  • 表單數據可以被記錄和 CSV 導出,通過電子郵件發送,或轉發到任何網址
  • 與 Django CMS 集成:向任何頁面添加表單
  • 使用拖放來更改表單字段的位置
  • 完全可折疊的管理界面,可以更好地概覽您的表單
  • 實現 Django 中包含的許多表單字段(TextField、EmailField、DateField 等)
  • Django 提供的驗證規則是完全可配置的(最大長度、正則表達式等)
  • 可定制的消息和標簽
  • 支持 POST 和 GET 形式

這可能為時已晚,但我遇到了類似的問題,因此我創建了一個更通用的插件: https : //github.com/metzlar/cms-form-plugin ,它恰好與 bennylope 的回答非常相似。

您可以通過拋出異常並在中間件中捕獲它來解決: http : //djangosnippets.org/snippets/2541/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM