如何使用DRY方法处理一页上的多种表单

问题描述

我总共需要显示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 个不同的内容,听起来您在分析中犯了错误。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...