簡體   English   中英

如何實現同時包含TemplateView和FormView的基於Django類的視圖?

[英]How to implement a Django class-based view that is both TemplateView and FormView?

我正在嘗試創建一個使用基於類的視圖的django網頁。 該網頁必須具有以下功能:

  1. 網頁必須通過URL上的HTTP GET接受參數,並使用這些參數向用戶顯示一些信息。
  2. 該網頁必須基於表單從用戶那里收集一些信息
  3. 該網頁必須驗證用戶提交給表單的信息。 如果任何表單數據無效,則必須在表單上向用戶顯示錯誤,以便她可以更正並重新提交。

我知道如何通過創建一個從django.views.generic.TemplateView繼承的類來創建一個編號為1的網頁。 我知道如何通過創建一個從django.views.generic.editFormView繼承的類來創建一個數字為23的網頁。 但是我不知道如何制作一個可以同時完成這三個步驟的網頁。 我嘗試創建一個同時繼承自TemplateViewFormView的類,但發現我仍然無法獲取HTTP GET數據。 請告知我如何進行這項工作。

這是我相關的urls.py條目:

url(
    r'^myPage/(?P<myArg1>\d+)-(?P<myArg2>\d+)/?$',
    myView.as_view(), 
    name='myName'
),

這是我的視圖類:

class myView(FormView, TemplateView):
    template_name = 'myApp/myTemplate.html'
    form_class = myForm
    success_url = reverse_lazy("successPage")


    def get_context_data(self, **kwargs):
        context = super(myView, self).get_context_data(**kwargs)

        myArg1 = int(kwargs["myArg1"])
        myArg2 = int(kwargs["myArg2"])

        # Do some validation and some other interesting stuff here based on
        # the values of myArg1 and myArg2 and put the result into self.newArg
        self.newArg = myDummyFunction(myArg1, myArg2)

        context["form"] = self.form_class


        return context


    def form_valid(self, form):

        formField1 = form.cleaned_data.get('field1')
        logger.debug("self.newArg = %s" % self.newArg) # <--- This Fails! self.newArg doesn't exist!
        return super(myView, self).form_valid(form)

您太復雜了。 就像幾乎所有通用視圖一樣,FormView已經繼承自TemplateView(或者繼承自ContextMixin,后者包含您所需要的所有功能),因此無需在聲明中添加第二個類。

您的代碼不起作用的唯一原因是,當表單有效時,不會調用get_context_data -因為有效表單始終會重定向到另一視圖,因此沒有理由獲取當前視圖的任何上下文數據。 但是您根本不需要在form_valid內部訪問該參數:您應該將其添加到get_context_data內部的上下文字典中,然后您就可以像其他任何上下文變量一樣在模板中訪問它。

暫無
暫無

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

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