![](/img/trans.png)
[英]How to check for user authentication in Django's class-based view with get_context_data
[英]How to get user's input using django class based view
編輯 2:使用行
context = super(ComecandoView, self).get_context_data(**kwargs)
取消注釋完成回溯。 如果我將此行更改為context = {}
我不會收到任何錯誤,但仍然無法使用用戶的變量。
- response = wrapped_callback(request, *callback_args, **callback_kwargs)
視圖 68 中的文件“C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\base.py”。返回 self.dispatch(request, *args, * *kwargs)
調度 88 中的文件“C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\base.py”。返回處理程序(請求,*args,**kwargs )
獲取 174 中的文件“C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\edit.py”。返回 self.render_to_response(self.get_context_data())
get_context_data 107 中的文件“C:\Users\gabriel\PycharmProjects\django-solo-testes\papaBelini\core\views.py”。context = super(ComecandoView, self).get_context_data(**kwargs)
get_context_data 93 中的文件“C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\edit.py”。kwargs['form'] = self.get_form( )
文件 "C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\edit.py" in get_form 45. return form_class(**self.get_form_kwargs())
異常類型:/comecando 處的 TypeError 異常值:'NoneType' 對象不可調用
編輯:我按照要求做了一些更改並更新了我的帖子,但它仍然不起作用。 我現在得到的錯誤是 NoneType 對象在行
context = super(ComecandoView, self).get_context_data(**kwargs)
上不可調用。 如果我評論這個並添加context {}
代碼工作正常但它沒有運行函數form_valid
,我試圖將該函數內的內容打印到終端並且沒有任何反應,但是代碼在更改后仍然按照預期執行,除了不檢索用戶的輸入。 我也嘗試過將表單方法更改為post
但沒有成功。
我想做什么:我想根據用戶的輸入更新在視圖中創建的圖表(即,用戶鍵入圖表的日期范圍,模板生成具有更新值的新圖表)。
我有一個 django 視圖,它已經創建了具有預定義值的圖形。
檢查下面的代碼,它工作正常。
視圖.py
class ComecandoView(FormView):
template_name = 'comecando.html'
form = GraphForm
def form_valid(self, form):
# store the user input here. These variables you can access then in your get_context_data method.
print('Hi') # Doesnt get called
self.q=form.cleaned_data['q']
return super(ComecandoView, self).form_valid(form)
def get_context_data(self, **kwargs):
#context = super(ComecandoView, self).get_context_data(**kwargs) # Commented this.
context = {} # ADDED THIS
lista_precos = []
lista_datas = []
for variacao in range(10500):
lista_precos.append(rjson['dataset']['data'][variacao][4])
lista_datas.append(rjson['dataset']['data'][variacao][0])
# Create a trace
trace = go.Scatter(
y = lista_precos,
x = lista_datas
)
data = [trace]
fig = go.Figure(data=data)
div = opy.plot(fig, auto_open=False, output_type='div')
context['graph'] = div
return context
template.html (comecando.html)
{% extends 'base.html' %}
{% block container %}
<form method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</div>
{% if graph %}
<div class="row">
<div class="col s12">
{{ graph|safe }}
</div>
</div>
{% endif %}
{% endblock %}
表單.py
from django import forms
class GraphForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
def send_email(self):
pass
我想要的是讓用戶能夠從組合框中選擇一個值,例如,或者在文本字段中鍵入一個值,然后在他單擊一個按鈕后,他鍵入的值將在我的視圖中可用,這樣我就可以生成具有新值的新圖形。
我試過的:
視圖.py
我在基於類的視圖中添加了此方法,但沒有按預期輸出,我只能在get
函數中使用“q”形式的值,而且,圖表沒有像以前那樣生成。
def get(self, request, *args, **kwargs):
q = request.GET.get('q')
error = ''
if not q:
error = "error message"
return render(request, self.template_name, {'error': error})
comecando.html(模板)
<form method="get">
<input type="text" name="q">
<input type="submit" value="Search">
</form>
有很多主題與我的問題非常相似,但我已經經歷了很多,但仍然無法解決,這里有幾個例子,我曾嘗試將其應用於我的問題但沒有成功:
您的起點很好,只需要正確完成表單處理即可。
將父視圖從 TemplateView 更改為 FormView 並調整必要的內容:創建一個表單,將其添加到視圖,調整模板。
然后刪除 get 方法並添加:
def form_valid(self, form):
# store the user input here. These variables you can access then in your get_context_data method.
self.q=form.cleaned_data['q']
return super(ComecandoView, self).form_valid(form)
您需要將模板更改為:{{form.as_table}}
並將獲取值的行替換為有意義的內容:“q”必須替換為表單的字段名稱(“name”或“message”)。
我有一個類似的問題。 我將輸入參數傳遞到 url 並重新加載頁面
from django.shortcuts import reverse
def get_success_url(self):
return reverse('<webpage>', kwargs={'q': self.request.POST.get('q')})
然后您可以使用諸如get_context_data
類的方法從 kwargs 訪問它,例如使用kwargs['q']
在這種情況下,您需要更新您的 URL 以保留參數“q”。 您可以將'(?P<q>\d+)/$'
附加到 url 以實現此目的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.