这是我的方法保存在我的form.py文件中。
这是ErroValue:
Exception Type: ValueError
Exception Value:
"<Nana: E>" needs to have a value for field "id" before this many-to-many relationship can be used.
1.-我明白我不是在正确的时间拯救我的娜娜。我做错了什么?
2 .-&#39; habilidades&#39;和&#39; especiliades&#39;在html中选择多个字段。我需要将这些数据保存到&#34; Nana&#34;模型。
@transaction.atomic()
def save(self):
valid_data = self.cleaned_data
documento_codigo = valid_data.pop('documento')
documento_tipo_id = valid_data.pop('tipo_documento')
documento = Documento(codigo=documento_codigo, tipo_documento_id=documento_tipo_id)
documento.save()
#habilidad
habilidades_nombre = valid_data.pop('habilidades')
habilidades_habilidades = Habilidad(habilidades_nombre)
habilidades_habilidades.save()
nana = Nana(documento=documento, **valid_data)
nana.save()
nana.habilidades.add(habilidades_habilidades)
return nana
我的表单(没有方法保存):
class NanaForm(forms.Form):
nombre = forms.CharField(label='Nombre', max_length=200)
apellido_paterno = forms.CharField(label='Apellido paterno', max_length=100)
apellido_materno = forms.CharField(label='Apellido materno', max_length=100)
fecha_de_nacimiento = forms.DateField(label='Fecha de nacimiento')
documento = forms.CharField(label='Documento', max_length=60, required=True)
tipo_documento = forms.CharField(label='Tipo de documento', max_length=100)
direccion = forms.CharField(label='Dirección', max_length=100)
telefono_o_celular = forms.CharField(label='Teléfono o celular', max_length=14)
latitud = forms.CharField(label='Latitud', max_length=100)
longitud = forms.CharField(label='Longitud', max_length=100)
genero = forms.CharField(label='Género', max_length=100)
habilidades = forms.CharField(label='Habilidades', max_length=100)
especialidades = forms.CharField(label='Especialidades', max_length=100)
# habilidades = forms.MultipleChoiceField(label="Habilidades", required=False, widget=forms.SelectMultiple)
# especialidades = forms.MultipleChoiceField(label="Especialidades", required=False, widget=forms.SelectMultiple)
foto = forms.ImageField(required=False)
更新1(型号):
class Especialidad(models.Model):
nombre = models.CharField(max_length=250)
def __str__(self):
return self.nombre
class Habilidad(models.Model):
nombre = models.CharField(max_length=250)
def __str__(self):
return self.nombre
class Nana(Usuario):
habilidades = models.ManyToManyField(Habilidad)
especialidades = models.ManyToManyField(Especialidad)
experiencia_con_mascotas = models.BooleanField(default=False)
foto = models.ImageField(upload_to='nanas_fotos',
default='media/nana-default.png', null=True, blank=False)
# antecedentes_policiales = models.FileField(upload_to='nanas_antecedentes_policiales')
def __str__(self):
return self.nombre
基础Usuario模型
class Usuario(models.Model):
class Meta:
abstract = True
nombre = models.CharField(blank=False, null=False, max_length=200)
apellido_paterno = models.CharField(blank=False, null=False, max_length=100)
apellido_materno = models.CharField(blank=True, null=False, max_length=100)
fecha_de_nacimiento = models.DateField(blank=False, null=False)
documento = models.OneToOneField(Documento, on_delete=models.CASCADE, blank=False, null=True)
#documento = models.CharField(blank=False, null=False, max_length=100)
#Se añadió tipo_documento como campo dentro de usuario. Solo así permite llamarlo como parte del modelo Nana.
# tipo_documento = models.ForeignKey(TipoDocumento, on_delete=models.SET_NULL, null=True)
telefono_o_celular = models.CharField(max_length=14)
esta_activo = models.BooleanField(default=False)
genero = models.CharField(blank=False, null=False, choices=GENERO, max_length=1, default='f')
direccion = models.CharField(blank=False, null=False, max_length=160, default='')
latitud = models.CharField(blank=False, null=False, max_length=60, default='')
longitud = models.CharField(blank=False, null=False, max_length=60, default='')
添加了视图
class RegistroView(View):
def get(self, request):
nana_form = NanaForm()
ls_tipos_de_documento = TipoDocumento.objects.values_list('id', 'nombre_corto')
ls_habilidades = Habilidad.objects.values_list('id', 'nombre')
ls_especialidades = Especialidad.objects.values_list('id', 'nombre')
context = {'nana_form': nana_form, 'ls_tipos_de_documento': ls_tipos_de_documento, 'ls_especialidades': ls_especialidades, 'ls_habilidades': ls_habilidades, }
return render(request, 'app_administrador/crear-registro-como-secretaria.html', context)
def post(self, request):
nana_form = NanaForm(request.POST, request.FILES)
if nana_form.is_valid():
nana_form.save()
else:
print(nana_form.errors)
print(nana_form['habilidades'])
return HttpResponseRedirect('/')
答案 0 :(得分:0)
但我认为你的问题是,当你应该使用1对多时,你试图使用多对多。
如果只需要1对1或1对多来访问信息,那么python将不允许你在这里使用多对多。
请尝试重新评估您的逻辑并确保您使用正确类型的数据库关系。在尝试这些之后,如果你确定你需要一个多对多,那么我将通过西班牙语帮助你,并帮助你。