Django:如何让表单向导在创建表单时接收请求对象?
Django: How can I make Form Wizard take in a request object when it creates the forms?
我怎样才能使 Django 的表单工具向导创建我的表单时,它还提供 request
对象作为参数?我使用表单工具的主要原因是要有一个多页表单。现在 "normally" 在没有向导的情况下创建我的 AnswerForm
,它看起来像
form = AnswerForm(request=request)
我接受 request
是因为在表单内,我想跟踪 request.session
中名为 'question'
的键。 (此键的目的是确保我可以跟踪与我试图通过此表单创建的 Answer
实例关联的 Question
模型实例。我实际上是不确定这是否是执行此操作的好方法。提示?)无论如何,现在我收到一个错误,这似乎意味着我的 ReviewWizard
、request
中的某处不是参数AnswerForm
已创建。我读过 instance_dict
如何在向导的 as_view()
中使用 urls.py
,但我认为这对这种情况没有帮助,因为 request
对象不是在 urls.py
中可用。谁能帮我这个?或者你知道有更好的方法来做我想做的事情吗?感谢您的帮助!!
(最终,我试图通过 Answers
到 request.session
跟踪 Questions
的原因是因为我认为当一个人看到的第一种形式出现时,它与 POSTed 表单的实例不同。由于我的 setup()
得到一个随机的 Question
,它可能与 POSTed 表单的 Question
不匹配,但也许有更好的所有这一切的方法??)
来自 urls.py
的行:
url(r'^review_form/', ReviewWizard.as_view([AnswerForm, AnswerForm]), name='review_form'),
这是我的表格:
class AnswerForm(forms.Form):
answer = forms.CharField(required=True)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
self.question = None
self.setup()
super(AnswerForm, self).__init__(*args, **kwargs)
self.fields['answer'].label = self.question.question
def setup(self):
if "question" in self.request.session:
self.question = Question.objects.get(id=self.request.session["question"])
else:
self.question = get_random_question()
self.request.session["question"] = self.question.id
def save(self):
del self.request.session["question"]
Answer.objects.create(
question=self.question,
author=self.request.user,
answer=self.cleaned_data['answer']
)
这是我在views.py
中的向导Class(我从别处复制的):
def process_form_data(form_list):
form_data = [form.cleaned_data for form in form_list]
print form_data[0]
print form_data[1]
return form_data
class ReviewWizard(SessionWizardView):
template_name = "review_form.html"
def done(self, form_list, **kwargs):
form_data = process_form_data(form_list)
return render("done.html", {"form_data": form_data})
您可以使用 SessionWizardView 中的 get_form_kwargs
方法将您的请求添加到表单 kwargs 中。
def process_form_data(form_list):
form_data = [form.cleaned_data for form in form_list]
print form_data[0]
print form_data[1]
return form_data
class ReviewWizard(SessionWizardView):
template_name = "review_form.html"
def done(self, form_list, **kwargs):
form_data = process_form_data(form_list)
return render("done.html", {"form_data": form_data})
def get_form_kwargs(self, step):
kwargs = super(ReviewWizard, self).get_form_kwargs(step)
kwargs['request'] = self.request
return kwargs
我怎样才能使 Django 的表单工具向导创建我的表单时,它还提供 request
对象作为参数?我使用表单工具的主要原因是要有一个多页表单。现在 "normally" 在没有向导的情况下创建我的 AnswerForm
,它看起来像
form = AnswerForm(request=request)
我接受 request
是因为在表单内,我想跟踪 request.session
中名为 'question'
的键。 (此键的目的是确保我可以跟踪与我试图通过此表单创建的 Answer
实例关联的 Question
模型实例。我实际上是不确定这是否是执行此操作的好方法。提示?)无论如何,现在我收到一个错误,这似乎意味着我的 ReviewWizard
、request
中的某处不是参数AnswerForm
已创建。我读过 instance_dict
如何在向导的 as_view()
中使用 urls.py
,但我认为这对这种情况没有帮助,因为 request
对象不是在 urls.py
中可用。谁能帮我这个?或者你知道有更好的方法来做我想做的事情吗?感谢您的帮助!!
(最终,我试图通过 Answers
到 request.session
跟踪 Questions
的原因是因为我认为当一个人看到的第一种形式出现时,它与 POSTed 表单的实例不同。由于我的 setup()
得到一个随机的 Question
,它可能与 POSTed 表单的 Question
不匹配,但也许有更好的所有这一切的方法??)
来自 urls.py
的行:
url(r'^review_form/', ReviewWizard.as_view([AnswerForm, AnswerForm]), name='review_form'),
这是我的表格:
class AnswerForm(forms.Form):
answer = forms.CharField(required=True)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
self.question = None
self.setup()
super(AnswerForm, self).__init__(*args, **kwargs)
self.fields['answer'].label = self.question.question
def setup(self):
if "question" in self.request.session:
self.question = Question.objects.get(id=self.request.session["question"])
else:
self.question = get_random_question()
self.request.session["question"] = self.question.id
def save(self):
del self.request.session["question"]
Answer.objects.create(
question=self.question,
author=self.request.user,
answer=self.cleaned_data['answer']
)
这是我在views.py
中的向导Class(我从别处复制的):
def process_form_data(form_list):
form_data = [form.cleaned_data for form in form_list]
print form_data[0]
print form_data[1]
return form_data
class ReviewWizard(SessionWizardView):
template_name = "review_form.html"
def done(self, form_list, **kwargs):
form_data = process_form_data(form_list)
return render("done.html", {"form_data": form_data})
您可以使用 SessionWizardView 中的 get_form_kwargs
方法将您的请求添加到表单 kwargs 中。
def process_form_data(form_list):
form_data = [form.cleaned_data for form in form_list]
print form_data[0]
print form_data[1]
return form_data
class ReviewWizard(SessionWizardView):
template_name = "review_form.html"
def done(self, form_list, **kwargs):
form_data = process_form_data(form_list)
return render("done.html", {"form_data": form_data})
def get_form_kwargs(self, step):
kwargs = super(ReviewWizard, self).get_form_kwargs(step)
kwargs['request'] = self.request
return kwargs