【问题标题】:Django UpdateView with multiple models and multiple forms don't work具有多个模型和多个表单的 Django UpdateView 不起作用
【发布时间】:2018-02-09 20:22:43
【问题描述】:

我正在使用两种不同的表单来加载来自两个不同模型的信息。一个表单被禁用编辑,第二个表单被启用。 在我使用 UpdateView 之前,一切都是正确的,当我尝试对启用编辑表单进行更改时,没有任何反应。我是 Django 新手,在教程中找到了代码并将其改编为我的项目。

为什么 UpdateView 不保存更改?

models.py:

class Sitioproyecto(models.Model):
    .
    .
    def __str__(self):
        return self.nombre_del_sitio

class Sitiocontratado(models.Model):
    sitioproyecto = models.ForeignKey(Sitioproyecto, on_delete=models.CASCADE)
    .
    .
    def __str__(self):
        return self.sitioproyecto.nombre_del_sitio

forms.py:

class SitioContratadoForm(forms.ModelForm):

    class Meta:
        model = Sitiocontratado
        exclude = ['slug',]
        widgets = {
        'fecha_de_contratacion' : forms.DateInput(attrs={
          'type' : 'date',
          'class' : "form-control pull-right",
          'id' : "fechadecon",
           }),
        'sitioproyecto' : forms.Select(attrs={
          'type' : 'text',
          'class' : "form-control",
          'id' : 'nombresitio',
          }),
          .
          .
        }

views.py:

class CrearSitiosContratadosView(CreateView):
    model = Sitiocontratado
    template_name = 'sitios/contratados/editar_contratado.html'
    form_class = SitioContratadoForm
    success_url = reverse_lazy('pagina:tabla_contratados')

class UpdateSitiosContratadosView(UpdateView):
    model = Sitiocontratado
    second_model = Sitioproyecto
    template_name = 'sitios/contratados/editar_contratado.html'
    form_class = SitioContratadoForm
    second_form_class = SitioProyectoForm
    success_url = reverse_lazy('pagina:tabla_contratados')

    def get_context_data(self, **kwargs):
        context = super(UpdateSitiosContratadosView, self).get_context_data(**kwargs)
        pk = self.kwargs.get('pk', 0)
        sitiocontratado = self.model.objects.get(id=pk)
        sitioproyecto = self.second_model.objects.get(id=sitiocontratado.sitioproyecto_id)
        if 'form' not in context:
            context['form'] = self.form_class()
        if 'form2' not in context:
            context['form2'] = self.second_form_class(instance=sitioproyecto)
        context['id'] = pk
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object
        id_sitiocontratado = kwargs['pk']
        sitiocontratado = self.model.objects.get(id=id_sitiocontratado)
        sitioproyecto = self.second_model.objects.get(id=sitiocontratado.sitioproyecto_id)
        form = self.form_class(request.POST, instance=sitiocontratado)
        form2 = self.second_form_class(request.POST, instance=sitioproyecto)
        if form.is_valid() and form2.is_valid():
            form.save()
            form2.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.render_to_response(self.get_context_data(form=form, form2=form2))

模板:

{% block content %}
<form class="form-vertical" method="POST">
{% csrf_token %}
<div class="box box-primary">
  <div class="box-header with-border">
    <h3 class="box-title">Agregar Sitio</h3>
  </div>
  <div class="box-body">
  <div class="row justify-content-start">
  <fieldset class="col-md-3 form-group" disabled>
    <label for="fechadeval" class="control-label">Fecha de Validación</label>
    {{ form2.fecha_de_validacion }}  
  </fieldset>
  <div class="col-md-3 form-group">
    <label for="fechadecon" class="control-label">Fecha de Contratación</label>
    {{ form.fecha_de_contratacion }}  
  </div>
  </div>
  <div class="row justify-content-start">
  <fieldset class="col-md-8 form-group" disabled>
    <label for="fechadecon" class="control-label">Nombre del Sitio</label>
    {{ form.sitioproyecto }}  
  </fieldset>
  <fieldset class="col-md-2 form-group" disabled>
    <label for="estatus" class="control-label">ID del Sitio</label>
    {{ form2.id_sitio }}  
  </fieldset>
  <fieldset class="col-md-1 form-group" disabled>
    <label for="estatus" class="control-label">Candidato</label>
    {{ form2.candidato }}  
  </fieldset>
  .
  .
</div>
<div class="box-footer">
  <a class="btn btn-default" href="{% url 'pagina:tabla_contratados' %}">Regresar</a>
  <button type="submit" value="Update" class="btn btn-primary">Guardar</button>
</div>
</div>
</form>
{% endblock %}

【问题讨论】:

  • 我假设您还制作了 SitioProyectoForm。您是否检查过 POST 是否发送了正确的信息?

标签: python django post


【解决方案1】:

在 get_context() 和 post() 中替换-

context['form2'] = self.second_form_class(instance=sitioproyecto)

context['form2'] = self.second_form_class(instance=request.Sitiocontratado.sitioproyecto)

然后简单地保存它!就是这样

你不需要处理pk

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-13
    • 2015-03-08
    • 1970-01-01
    • 2015-09-11
    • 2011-06-29
    • 1970-01-01
    • 2017-08-07
    相关资源
    最近更新 更多