簡體   English   中英

如何將 URL 值從模板傳遞到 Django 中基於 Class 的視圖內的 form_valid 方法

[英]How to pass a URL value from a template to a form_valid method inside a Class Based View in Django

我開始使用 django,但遇到了一個我無法解決的問題。 我相信這應該很容易,但我無法弄清楚。

我從通過 URL 傳遞的模板中獲取一個 ID。

數據.html

...
    <div class="container">

      <form method="GET" action="{% url 'data:next' %}">

          <input type="hidden" required name='job_id'>
          <button type="submit" class="btn btn-primary">Run Next</button>
          {% csrf_token %}

      </form>

    </div>
...

url.py

app_name = "data"

urlpatterns = [
    ...
    ...
    path('next/', RunNextView.as_view(), name='next'),
]

這似乎將 job_id 值傳遞給 URL,因為在選中一個復選框(在本例中,job_id 指向 44)並單擊“下一步運行”按鈕后,我得到一個 url,例如:

http://localhost:8000/data/next/?job_id=44&Some-token

我認為這很好。 現在我想將數字 44 傳遞給基於 class 的視圖,這是問題所在,我無法做到。

如下所示,我需要 job_id 才能運行run_next_task任務。 我如何獲取 44 並將其傳遞給 CBV 中的 form_valid 方法?

視圖.py

class RunNextView(FormView):
    template_name = 'next.html'
    form_class = RunForm
    success_url = reverse_lazy('data:list')

    def dispatch(self, request, *args, **kwargs):
        if not request.user.is_authenticated:
            return redirect(reverse_lazy('account:login'))
        else:        
            return super(RunNextView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        cal = form.save(False)
        cal.user = self.request.user
        cal.save()
        cal.send_update()

        job_id = self.request.GET.get('job_id') //this way doesn't work

        run_next_task.delay(pk=cal.pk, dir=job_id)
        return redirect(self.success_url)

    def form_invalid(self, form):
        for field in form.errors:
            form[field].field.widget.attrs['class'] += F" {form.error_css_class}"
        return self.render_to_response(self.get_context_data(form=form))

我做了無數的實驗。

job_id = self.request.GET.get('job_id') 在 form_valid 和幾乎所有其他組合中。 我嘗試使用 session 和全局變量。 我嘗試以許多不同的方式使用 kwargs,例如 job_id=self.kwargs['job_id']。

他們都沒有工作。 我一定缺少一些基本的東西。

任何幫助表示贊賞。 謝謝;]

我沒有自己嘗試過,但試一試;)

我在__init__中添加了一個新屬性
然后在form_valid中使用它。

class RunNextView(FormView):
    template_name = 'next.html'
    form_class = RunForm
    success_url = reverse_lazy('data:list')

    # Add this ↓
    def __init__(self, **kwargs):
        self.job_id = ""
        super().__init__(**kwargs) # <- You don't need put 'self' here. So, remove it.

    # Add this as well ↓
    def get(self, request, *args, **kwargs):
        self.job_id = request.GET.get('job_id')
        super().get(request, *args, **kwargs)# <- Remove 'self' here

    # some code...

    def form_valid(self, form):
        # some code...
        job_id = self.job_id #      <- Change here
        # some code...
    
    # some code...

編輯

在這個例子中,我重寫了__init__ function,在我創建一個新屬性job_id之后,我通過執行super().__init__(**kwargs)讓父 function 做任何它需要做的事情。
您可以在 class 中的任何位置訪問self.job_id

如果你想用表單發送數據,你必須選擇 POST 方法而不是 GET。 將“job_id”(或 job.id。您傳遞的任何內容)添加到輸入值中,如下所示:

  <form method="POST" action="{% url 'data:next' %}">

      <input type="hidden" value="{{job_id}}" required name='job_id'>
      <button type="submit" class="btn btn-primary">Run Next</button>
      {% csrf_token %}

  </form>

然后在視圖中,定義一個post方法:

class RunNextView(FormView):
     def post(self,request):
         # Since name='job_id'
         posted_id=request.POST["job_id"]

暫無
暫無

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

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