Django:"< ...>"需要有一个字段的值" id"在此之前可以使用多对多关系

时间:2017-12-01 16:34:03

标签: python django

这是我的方法保存在我的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('/')

1 个答案:

答案 0 :(得分:0)

但我认为你的问题是,当你应该使用1对多时,你试图使用多对多。

如果只需要1对1或1对多来访问信息,那么python将不允许你在这里使用多对多。

请尝试重新评估您的逻辑并确保您使用正确类型的数据库关系。在尝试这些之后,如果你确定你需要一个多对多,那么我将通过西班牙语帮助你,并帮助你。