如何使用基于 django 类的视图获取用户的输入

Posted

技术标签:

【中文标题】如何使用基于 django 类的视图获取用户的输入【英文标题】:How to get user's input using django class based view 【发布时间】:2017-12-14 18:57:53 【问题描述】:

编辑 2:使用未注释的行 context = super(ComecandoView, self).get_context_data(**kwargs) 完成回溯。如果我将此行更改为context = ,我不会收到任何错误,但仍然无法使用用户的变量。

    response = Wrapped_callback(request, *callback_args, **callback_kwargs)

文件 “C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\base.py” 在视野中 68. return self.dispatch(request, *args, **kwargs)

文件 “C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\base.py” 在调度中 88. return handler(request, *args, **kwargs)

文件 “C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\edit.py” 在得到 174. return self.render_to_response(self.get_context_data())

文件 "C:\Users\gabriel\PycharmProjects\django-solo-testes\papaBelini\core\views.py" 在 get_context_data 中 107. context = super(ComecandoView, self).get_context_data(**kwargs)

文件 “C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\edit.py” 在 get_context_data 中 93. kwargs['form'] = self.get_form()

文件 “C:\Users\gabriel\PycharmProjects\django-solo-testes\wvevn\lib\site-packages\django\views\generic\edit.py” 在 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 视图,它已经创建了具有预定义值的图形。

检查下面的代码,它工作正常。

views.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 %

forms.py

from django import forms
class GraphForm(forms.Form):
    name = forms.CharField()
    message = forms.CharField(widget=forms.Textarea)
    def send_email(self):
        pass

我想要的是让用户能够从组合框中选择一个值,或者在文本字段中输入一个值,并且在他单击一个按钮后,他输入的值将在我的视图中可用,以便我'将能够生成具有新值的新图表。

我的尝试:

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

有很多与我的问题非常相似的主题,但我已经经历了很多但仍然无法解决它,这里有几个我尝试过应用于我的问题但没有解决的示例t 锻炼:

How to get the submitted value of a form in a Django class-based view? Very simple user input in django Python Django Getting user input

【问题讨论】:

您使用哪个库来生成绘图?在其他世界中,您的代码中的 goopy 是什么? @afonso.kim 它的阴谋 【参考方案1】:

你有一个很好的起点,只需要正确完成form handling。

将父视图从 TemplateView 更改为 FormView 并调整必要的东西:创建一个 Form,将其添加到视图中,调整模板。

然后去掉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”)。

【讨论】:

感谢您的回答,我已经尝试了您所说的但仍然无法正常工作,我已经更新了我的主题,解释了发生了什么,我尝试了什么并发布了我的代码。 我刚刚为我得到的错误添加了完整的回溯。我试过改变很多东西,首先,我尝试在 form_valid 函数中打印 self.q ,没有任何反应。我还尝试在get_context_data 函数中打印self.q,但随后出现错误 ComecandoView has no attribute q。所有这些打印都是在将随机文本提交到“comecando”html 页面输入文本字段后进行的【参考方案2】:

我遇到了类似的问题。我将输入参数传递到 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&lt;q&gt;\d+)/$' 附加到网址以实现此目的

【讨论】:

以上是关于如何使用基于 django 类的视图获取用户的输入的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django 中基于类的详细视图中获取当前对象/产品?

在基于 django rest 类的视图中允许不同类型的用户使用不同的视图

Django 基础知识:如何使用基于类的视图呈现上下文

如何在 Django 1.3 中使用基于类的视图重定向条件?

如何在基于类的视图中使用LoginRequiredMixin来发送一个django错误信息?

Django 基于类的通用视图和身份验证