我正在尝试在我的模型'TipoDocumento'中显示我的表单中的下拉列表(我需要将列'nombre_corto'显示为列表)。
1)我的模型名称是“Cocinera”,Cocinera继承了我的模型“Usuario”。
2)“Usuario”从我的模型“Documento”继承了它的'documento'字段
3)“Documento”模型从“TipoDocumento”继承了它的'tipo_documento'字段。
但我无法通过我的'Cocinera'模型通过我的'CocineraForm'表单将'tipo_documento'作为列表呈现。我得到一个错误,最后详细说明。
我的所有模特都在“核心”应用中。 只有呈现的表单才会出现在我的其他应用“app_administrador”中。
================================
Nucleo - 应用程序名为nucleo
================================
模型:
模型'TipoDocumento'
from django.db import models
class TipoDocumento(models.Model):
nombre_corto = models.CharField(blank=False, null=False, max_length=25)
nombre_largo = models.CharField(blank=False, null=False, max_length=100)
def __str__(self):
return self.nombre_corto
模型'Documento'
class Documento(models.Model):
def __str__(self):
return self.codigo
tipo_documento = models.ForeignKey(TipoDocumento, on_delete=models.SET_NULL, null=True)
codigo = models.CharField(max_length=25)
模型'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)
模特'Cocinera':
class Cocinera(Usuario):
habilidades = models.ForeignKey(Habilidad, blank=True, null=True)
experiencia_con_mascotas = models.BooleanField(default=False)
def __str__(self):
return self.nombre
================================
app_administrador
================================
我的表格
class CocineraForm(forms.ModelForm):
class Meta:
model = Cocinera
fields = ['nombre', 'apellido_paterno', 'apellido_materno', 'tipo_documento', 'documento', 'fecha_de_nacimiento', 'direccion', 'telefono_o_celular' , 'latitud_y_longitud',
'genero', 'antecedentes_policiales', 'foto']
widgets = {
'fecha_de_nacimiento': DateInput()
}
相关问题: 根据这个Use Django ModelChoice field to create pulldown to lookup table?
我添加了:
tipo_documento = forms.ModelChoiceField(queryset=TipoDocumento.objects.all(),
empty_label=None)
但是当我运行我的应用程序时,我得到了:
File "/home/ogonzales/Escritorio/web_envs/
cocineras_env/lib/python3.5/site-packages/django/forms/models.py",
line 277, in __new__raise FieldError(message)
django.core.exceptions.FieldError: Unknown field(s)
(tipo_documento) specified for Cocinera
答案 0 :(得分:2)
当然,您可以在表单上添加其他字段。
但是您不允许在字段列表中添加非模型字段'tipo_documento',因为这仅指模型中定义的字段。
所以你应该很高兴:
class CocineraForm(forms.ModelForm):
class Meta:
model = Cocinera
fields = ['nombre', 'apellido_paterno', 'apellido_materno', 'documento',
'fecha_de_nacimiento', 'direccion', 'telefono_o_celular', 'latitud_y_longitud',
'genero', 'antecedentes_policiales', 'foto']
widgets = {
'fecha_de_nacimiento': DateInput()
}
tipo_documento = forms.ModelChoiceField(queryset=TipoDocumento.objects.all(),
empty_label=None)
请注意字段列表中缺少的“tipo_documento”。
答案 1 :(得分:2)
所以,我找到了答案:我需要使用2个表单,而不仅仅是1,并在'模板中进行渲染。
步骤:
1.-我需要创建一个额外的表格" DocumentoForm",除了" CocineraForm"。
class CocineraForm(forms.ModelForm):
class Meta:
model = Cocinera
fields = ['nombre', 'apellido_paterno', 'apellido_materno', 'fecha_de_nacimiento', 'direccion', 'telefono_o_celular', 'latitud_y_longitud',
'genero', 'foto']
#New DocumentoForm
class DocumentoForm(forms.ModelForm):
class Meta:
model = Documento
fields = ['tipo_documento', 'codigo']
2.-我需要验证两种形式的所有字段。创建一个" Documento"来自表单" DocumentoForm"的实例,而不将其保存到DB(commit =' False')。我需要添加这个' Documento'实例到了#cocinera'作为一个领域的模型。 就在这里,我应该保存' CocinerForm'与' .save()'。
class RegistroView(View):
def get(self, request):
cocinera_form = CocineraForm()
documento_form = DocumentoForm()
context = {'cocinera_form': cocinera_form, 'documento_form': documento_form}
return render(request, 'app_administrador/crear-registro-como-secretaria.html', context)
def post(self, request):
cocinera_form = CocineraForm(request.POST, request.FILES)
documento_form = DocumentoForm(request.POST)
if all((cocinera_form.is_valid(), documento_form.is_valid())):
documento = documento_form.save()
cocinera = cocinera_form.save(commit=False) #Don't save it to the DB. Just store the variable for now.
cocinera.documento = documento #adding documento to 'Cocinera' model through CocineraForm.
cocinera.save()
return HttpResponseRedirect('/')
3.-在模板中使用2个表单。
<form action="" method="post">
{% csrf_token %}
{{ cocinera_form }}
{{ documento_form }}
</form>