![](/img/trans.png)
[英]Calling a special (non-HTTP) URL from the form_valid method of a Django class-based view
[英]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.