问题描述
我总共需要显示10张表格。我正在使用DetailView来显示它们,并使用CreateView来处理它们的逻辑。到目前为止,我的views.py看起来像这样:
from .forms import (
WeightRepsModelForm as wr_form,WeightdistanceModelForm as wd_form,WeightTimeModelForm as wt_form,RepsdistanceModelForm as rd_form,RepsTimeModelForm as rt_form,distanceTimeModelForm as dt_form,WeightModelForm as w_form,RepsModelForm as r_form,distanceModelForm as d_form,TimeModelForm as t_form,)
class ExerciseDetailView(DetailView):
model = Exercise
template_name = 'workouts/types.html'
def get_context_data(self,**kwargs):
context = super(ExerciseDetailView,self).get_context_data(**kwargs)
context['wr_form'] = wr_form
context['wd_form'] = wd_form
context['wt_form'] = wt_form
context['rd_form'] = rd_form
context['rt_form'] = rt_form
context['dt_form'] = dt_form
context['w_form'] = w_form
context['r_form'] = r_form
context['d_form'] = d_form
context['t_form'] = t_form
return context
class WeightRepFormView(CreateView):
form_class = wr_form
def form_valid(self,form):
form.instance.exercise_id = self.kwargs['pk']
return super().form_valid(form)
def get_success_url(self):
return reverse('workouts:exercise_detail',kwargs={'pk': self.kwargs['pk']})
这对于第一种形式工作正常,但是我需要创建10个接近相同的CreateViews才能继续使用此方法。有谁能够推荐一种更有效的方法?
解决方法
首先,您可以更轻松地使用一个类来完成显示表单和保存表单的两项工作。即使您想同时保存所有表单(我认为您想要),您也无法通过一个按钮使用 10 个不同的视图来做到这一点。
你展示表格的第一部分没问题。在 ExerciseDetailView
中定义一个 post 方法来处理 post 请求。然后在那个 def post()
:
def post( self,request):
wr = wr_form(request.POST)
if wr.is_valid():
#save the the instance and change it the way you want
wd = wd_form(request.POST)
if wd.is_valid():
#save the instance and change it the way you want
.
.
.
并且在第 10 个表单之后重定向到一个页面。请记住,如果您的用户想要输入多个表单的数据并保存它们,您不能使用多个函数或类来做到这一点。注意,在您的模板中,您应该这样做:
<form method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">complete the form(s)</legend>
{{ wr_form|crispy }}
{{ wd_form|crispy }}
.
.
.
# put all the 10 form like this
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info" type="submit">Save</button>
# it is bootstrap but the form are every where like this
这样,用户通过一个按钮传递所有表单及其数据。(一个 csrf_token ) 如果你在想什么,请告诉我。 (不是针对个人,但如果您在一个模板中显示 10 个不同的内容,听起来您在分析中犯了错误。)