Django 2,如何使用POST请求在FormView中创建Form实例?

时间:2018-04-10 10:38:05

标签: python django django-forms

我有一个用HTML制作的表单,我使用formview来利用POST方法。该表单包含几个HTML相关选择的信息(与Javascript交互),因此对我来说最好的选择是创建一个HTML表单。

总之,我想要实例化一个表格。带有POST信息的表单,处理表单,返回错误消息或保存(保存不是问题)。

代码

表单视图

 class ServiceOrderForm(forms.Form):

        TYPE = (
            ('preventivo', 'Preventivo'),
            ('correctivo', 'Correctivo'),
            )

        STATUS = (
            ('abierta','Abierta'), #amarillo
            ('aprobada','Aprobada'), #verde
            ('modificada','Modificada'), #rojo
            ('realizada','Realizada'), #azul
            ('rechazada','Rechazada'), #naranja
            ('Cerrada','Cerrada'), #Azul con check
            )

        id_orden_servicio = forms.IntegerField()
        id_establecimiento = forms.IntegerField()
        id_equipo_establecimiento = forms.IntegerField()
        hora_entrada = forms.DateField()
        hora_salida = forms.DateField()
        tipo = forms.ChoiceField(choices=TYPE)
        id_tecnico = forms.IntegerField()
        fecha_panificada=  forms.DateField()
        hora_planificada = forms.DateField()
        fecha = forms.DateField()
        estado = forms.ChoiceField(choices=STATUS)
        observaciones = forms.TextInput()

查看

class ServiceOrderTemplateView(FormView):
    ''' Presenta el formulario del evento y sus detalles '''
    template_name = 'serviceorders/service-order.html'
    form_class = ServiceOrderForm

    def get(self, request, **kwargs):

        context = super(ServiceOrderTemplateView, self).get_context_data \
            (**kwargs)
        if request.user.is_authenticated and self.request.user.is_active:
            customer_group = CustomerGroupData(request.user.id).get()
            context_data_event = ContextDataEvent(customer_group)
            event_service = ServiceEvent(kwargs['id_order_service'])
            event_data = event_service.getEvent()

            estado_equipo = {
                'garantia': {
                    'label': 'danger',
                    'icon': 'fa-ban',
                },
                'vida_util' : {
                    'label': 'success',
                    'icon': 'fa-check',
                }
            }

            data = {
                'customer_group': customer_group,
                'establishments' : context_data_event.getEstablishments(),
                'equipments' : context_data_event.getEquipments(),
                'create': False,
                'technicals' : context_data_event.getTechnicals(),
                'current_equipment' : event_data['equipment'],
                'current_technical' : event_data['technical'],
                'current_establishment': event_data['establishment'],
                'current_year': 2018,
                'equipment_standard' : event_data['equipment_standard'],
                'historic_orders' : event_service.getHistoricEvent(),
                'current_order_detail' : event_service.getDetailService(),
                'images_service_order' : event_service.getImageItem(),
                'items_mantenimiento' : event_service.getDetailService(),
                'equipment_estatus' : estado_equipo,
                'order_service' : event_data['order_service'],
                'id_order' : kwargs['id_order_service'],
            }

            context.update({'data': data})

        return self.render_to_response(context)


    def post(self, request, *args, **kwargs):
        context = super(ServiceOrderTemplateView, self).get_context_data \
            (**kwargs)

        form = ServiceOrderForm(request.POST)
        #the form always is empty

        #if form is valid this method return
        if form.is_valid():
            print('El formulario es valido')
            #more code
            HttpResponseRedirect('/mostrar/orden/servicio/')
        else:


            print('El formulario en invalido')
            #return this error ti html template
            print(form.errors)
        data = {
            'form': form,
            'errors' : form.errors
        }
        context.update({ 'data' : data })
        print('recibiendo data por post')

        return self.render_to_response(context)

HTML

<form action="" method="post" role="form">
         {% csrf_token %}
       <input type="hidden" name="id_orden_servicio" value="{{ data.order_service.id_orden_servicio }}">
         <div class="col-md-1"></div>
         <div class="col-md-5">
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Nro Orden:</label>
               </div>
               <div class="col-sm-4">
                  <input
                  type="text"
                  readonly = ""
                  name="id_orden_servicio"
                  value="OS-{{ data.current_year }}-{{ data.order_service.id_orden_servicio }}"
                  >
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Establecimiento:</label>
               </div>
               <div class="col-sm-4">
                   <select class="btn btn-sm btn-default" name="id_establecimiento" id="id_establecimiento">
                       {% if data.create == True %}
                             <option selected disabled>Seleccione...</option>
                            {% for establishment in data.establishment %}
                                <option value="{{ establishment.id_establecimiento }}">{{ establishment }}</option>
                            {% endfor %}
                       {% else %}
                            <option value="{{ data.current_establishment.id_establecimiento }}" disabled selected>{{ data.current_establishment }}</option>
                       {% endif %}
                   </select>
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Equipos:</label>
               </div>
               <div class="col-sm-6">
                  <select class="btn btn-sm btn-default" name="id_equipo_establecimiento" id="id_equipo_establecimiento">
                      {% if data.create == True %}
                             <option selected disabled>Seleccione...</option>
                              {% for equipment in data.equipments %}
                                <option value="{{equipment.id_equipo_establecimiento}}">{{ equipment }}</option>
                              {%  endfor %}
                      {% else %}
                        <option value="{{data.current_equipment.id_equipo_establecimiento}}" disabled selected>{{ data.current_equipment }}</option>
                       {% endif %}
                  </select>
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Mantenimiento.:</label>
               </div>
               <div class="col-sm-6">
                  <select class="btn btn-sm btn-default" name="tipo_mantenimiento" id="tipo_mantenimiento">
                         {% if data.create == True %}
                             <option selected disabled>Seleccione...</option>
                             <option value="preventivo">Preventivo</option>
                             <option value="correctivo">Correctivo</option>
                         {% else %}
                              <option selected disabled value="{{data.order_service.tipo}}">{{ data.order_service.tipo | upper}}</option>
                      {% endif %}
                     </option>
                  </select>
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Técnico:</label>
               </div>
               <div class="col-sm-6">
                  <select class="btn btn-sm btn-default" name="id_tecnico" id="id_tecnico">
                          {% if data.create == True %}
                             <option selected disabled>Seleccione...</option>
                            {% for technical in data.technicals %}
                                <option value="{{technical.id_tecnico}}">{{ technicals.apellidos }} {{ technicals.nombres }} </option>
                            {% endfor %}
                          {% else %}
                            <option value="{{ data.order_service.id_tecnico_id }}">{{ data.order_service.id_tecnico }}</option>
                          {% endif %}
                     </option>
                  </select>
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Fecha Mant.:</label>
               </div>
               <div class="col-sm-5">
                  <input type="text" name="fecha" style="width: 100%" value = "{{ data.order_service.fecha | date:"d/m/Y"  }}">
               </div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Observaciones:</label>
               </div>
               <div class="col-sm-5">
                  <textarea rows="5" cols="31" name="observaciones">{{ data.order_service.observaciones }}</textarea>
               </div>
            </div>
         </div>
         <div class="col-md-5">
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Imagen de equipo:</label>
               </div>
               <div class="col-sm-6">
                  <img src="{{BASE_URL}}media/{{ data.current_equipment.url_imagen }}" style="width: 60%;height: auto">
               </div>
               <div class="col-sm-2 text-left">
                  <span class="label label-{{data.equipment_estatus.garantia.label}}">
                      <i class="fas {{ data.equipment_estatus.garantia.icon }}"></i> Garantía
                  </span>
                  <span class="label label-{{data.equipment_estatus.vida_util.label}}">
                      <i class="fas {{ data.equipment_estatus.vida_util.icon }}"></i> Vida Útil
                  </span>
               </div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Plano ubicación:</label>
               </div>
               <div class="col-sm-6">
                  <a href="{{BASE_URL}}media/{{ data.current_equipment.url_ubicacion}}" class="btn btn-sm btn-default" target="_blank">
                      <i class="fa fa-eye"></i> Ver Ubicación
                  </a>
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Lugar:</label>
               </div>
               <div class="col-sm-6">
                  <input type="text" value="{{ data.current_equipment.ubicacion }}" readonly="">
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Nro Serie:</label>
               </div>
               <div class="col-sm-6">
                  <input type="text" value="{{ data.current_equipment.nro_serie }}" readonly="">
               </div>
               <div class="col-sm-2"></div>
            </div>
            <div class="row">
               <div class="col-sm-4 text-right">
                  <label>Estado Orden:</label>
               </div>
               <div class="col-sm-6">
                   {% if data.create == True %}
                   <a href="#" class="btn btn-sm {{data.order_service.estado}}">
                       <i class="fas fa-info-circle"></i>
                   ABIERTA
                   </a>
                   {% else %}
                   <a href="#" class="btn btn-sm {{data.order_service.estado}}">
                       <i class="fas fa-info-circle"></i>
                       {{ data.order_service.estado | upper }}
                   </a>
                   {% endif %}
               </div>
               <div class="col-sm-2"></div>
            </div>
            <br>
            <div class="row">
               <div class="col-sm-8 text-right">
               </div>
               <div class="col-sm-4 text-right">
                  <button class="btn btn-sm btn-primary" type="submit">
                      {% if data.create == True %}
                      <span class="fas fa-plus"></span>
                      Agergar Orden Mantenimiento
                      {% else %}
                      <span class="fas fa-save"></span>
                      Guardar Cambios
                      {% endif %}
                  </button>
               </div>
            </div>
         </div>
         <div class="col-md-1"></div>
   </form>

谢谢!

1 个答案:

答案 0 :(得分:0)

我解决了它

表单始终为空,因为forms.py与html

的字段不同

我无法使用createview,因为需要在表单中添加信息。