如何使用基于 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>
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有很多与我的问题非常相似的主题,但我已经经历了很多但仍然无法解决它,这里有几个我尝试过应用于我的问题但没有解决的示例t 锻炼:
【问题讨论】:
您使用哪个库来生成绘图?在其他世界中,您的代码中的go
和 opy
是什么?
@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<q>\d+)/$'
附加到网址以实现此目的
【讨论】:
以上是关于如何使用基于 django 类的视图获取用户的输入的主要内容,如果未能解决你的问题,请参考以下文章
如何从 django 中基于类的详细视图中获取当前对象/产品?
在基于 django rest 类的视图中允许不同类型的用户使用不同的视图
如何在 Django 1.3 中使用基于类的视图重定向条件?