簡體   English   中英

如何使用基於 Django 類的視圖獲取用戶的輸入

[英]How to get user's input using django class based view

編輯 2:使用行context = super(ComecandoView, self).get_context_data(**kwargs)取消注釋完成回溯。 如果我將此行更改為context = {}我不會收到任何錯誤,但仍然無法使用用戶的變量。

  1. 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.

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