【发布时间】: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 是否发送了正确的信息?