如何使用基于django类的视图

时间:2017-07-10 21:54:39

标签: python django python-3.x

  

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

     
      
  1. response = wrapped_callback(request,* callback_args,** callback_kwargs)
  2.         

    文件   “C:\用户\加布里埃尔\ PycharmProjects \ Django的独奏睾丸\ wvevn \ LIB \站点包\ Django的\意见\通用\ base.py”   在视野中     68.返回self.dispatch(request,* args,** kwargs)

         

    文件   “C:\用户\加布里埃尔\ PycharmProjects \ Django的独奏睾丸\ wvevn \ LIB \站点包\ Django的\意见\通用\ base.py”   在发货     88.返回处理程序(request,* args,** kwargs)

         

    文件   “C:\用户\加布里埃尔\ PycharmProjects \ Django的独奏睾丸\ wvevn \ LIB \站点包\ Django的\意见\通用\ edit.py”   在得到     174.返回self.render_to_response(self.get_context_data())

         

    文件   “C:\用户\加布里埃尔\ PycharmProjects \ Django的独奏睾丸\ papaBelini \核心\ views.py”   在get_context_data中     107. context = super(ComecandoView,self).get_context_data(** kwargs)

         

    文件   “C:\用户\加布里埃尔\ PycharmProjects \ Django的独奏睾丸\ wvevn \ LIB \站点包\ Django的\意见\通用\ edit.py”   在get_context_data中     93. kwargs ['form'] = self.get_form()

         

    文件   “C:\用户\加布里埃尔\ PycharmProjects \ Django的独奏睾丸\ wvevn \ LIB \站点包\ Django的\意见\通用\ edit.py”   在get_form中     45.返回form_class(** self.get_form_kwargs())

         

    异常类型:/ comecando中的TypeError异常值:'NoneType'   对象不可调用

         编辑:我根据要求做了一些更改并更新了我的帖子,但它仍然无效。我现在得到的错误是在行context = super(ComecandoView, self).get_context_data(**kwargs)上无法调用NoneType对象。如果我对此进行评论并添加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> 
  

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

2 个答案:

答案 0 :(得分:2)

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

将您的父视图从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}}     

并将获取值的行替换为有意义的行:&#34; q&#34;必须由表单的字段名称替换(&#34;名称&#34;或&#34;消息&#34;)。

答案 1 :(得分:0)

我有类似的问题。我将输入参数传递到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['q']之类的方法从kwargs中访问它

在这种情况下,您需要更新URL以保留参数“ q”。您可以在网址后附加'(?P<q>\d+)/$'来实现