Return 使用当前 FormWizard 中的数据的新 FormWizard
Return New FormWizard With Data From Current FormWizard
目前,我有一个基本的 FormWizard,其步骤使用 ModelForm 派生表单。当用户完成后,它会保存到数据库中。我不想将它们重定向回一个空的 FormWizard,而是想呈现一个新的 FormWizard 实例,从第一步开始,但是用他们在初始表单中输入的信息预填充特定字段。
以下是基本功能:
class CustomWizardView(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'uploads'))
instance = None
def get_form_instance(self, step):
if not self.instance:
self.instance = Post()
return self.instance
def done(self, form_list, **kwargs):
self.instance.user = self.request.user
self.instance.save()
return HttpResponseRedirect('/session-form')
在我意识到我的表单需要多大并且需要 FormWizard 之前,我是这样做的:
class PostFormView(TemplateView):
template_name = 'form/form.html'
def get(self, request):
form = TestPostForm()
return render(request, self.template_name, {'form': form})
def post(self, request):
form = TestPostForm(request.POST, request.FILES)
building_floor_data = 0
department_data = ''
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
building_floor_data = form.cleaned_data['building_floor']
department_data = form.cleaned_data['department']
post.save()
# return redirect('form')
form = TestPostForm()
form.fields['building_floor'].initial = building_floor_data
form.fields['department'].initial = department_data
return render(request, self.template_name, {'form': form})
我是 Django 的新手,所以这可能是一个非常明显的飞跃。我只是不明白。
终于搞清楚了。您必须覆盖 SessionWizardView 的 get_form_initial 函数。你要建立一个字典,初始字典,里面应该是字段名和期望值的键值对。对我来说,检索值的方法是使用过滤查询获取用户最后在数据库中输入的值。示例如下:
def get_form_initial(self, step):
initial = {}
user = self.request.user.username
if step == '0':
main_db_query = Post.objects.filter(user__username__exact=user).last()
if main_db_query:
initial = {'site': main_db_query.site,
'floor': main_db_query.floor,
'room_number': main_db_query.room_number,
'department': main_db_query.department}
return self.initial_dict.get(step, initial)
目前,我有一个基本的 FormWizard,其步骤使用 ModelForm 派生表单。当用户完成后,它会保存到数据库中。我不想将它们重定向回一个空的 FormWizard,而是想呈现一个新的 FormWizard 实例,从第一步开始,但是用他们在初始表单中输入的信息预填充特定字段。
以下是基本功能:
class CustomWizardView(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT, 'uploads'))
instance = None
def get_form_instance(self, step):
if not self.instance:
self.instance = Post()
return self.instance
def done(self, form_list, **kwargs):
self.instance.user = self.request.user
self.instance.save()
return HttpResponseRedirect('/session-form')
在我意识到我的表单需要多大并且需要 FormWizard 之前,我是这样做的:
class PostFormView(TemplateView):
template_name = 'form/form.html'
def get(self, request):
form = TestPostForm()
return render(request, self.template_name, {'form': form})
def post(self, request):
form = TestPostForm(request.POST, request.FILES)
building_floor_data = 0
department_data = ''
if form.is_valid():
post = form.save(commit=False)
post.user = request.user
building_floor_data = form.cleaned_data['building_floor']
department_data = form.cleaned_data['department']
post.save()
# return redirect('form')
form = TestPostForm()
form.fields['building_floor'].initial = building_floor_data
form.fields['department'].initial = department_data
return render(request, self.template_name, {'form': form})
我是 Django 的新手,所以这可能是一个非常明显的飞跃。我只是不明白。
终于搞清楚了。您必须覆盖 SessionWizardView 的 get_form_initial 函数。你要建立一个字典,初始字典,里面应该是字段名和期望值的键值对。对我来说,检索值的方法是使用过滤查询获取用户最后在数据库中输入的值。示例如下:
def get_form_initial(self, step):
initial = {}
user = self.request.user.username
if step == '0':
main_db_query = Post.objects.filter(user__username__exact=user).last()
if main_db_query:
initial = {'site': main_db_query.site,
'floor': main_db_query.floor,
'room_number': main_db_query.room_number,
'department': main_db_query.department}
return self.initial_dict.get(step, initial)