Oma*_*les 8 django inheritance django-forms
我正在尝试在我的模型'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
Run Code Online (Sandbox Code Playgroud)
模型'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)
Run Code Online (Sandbox Code Playgroud)
型号'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)
Run Code Online (Sandbox Code Playgroud)
型号'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
Run Code Online (Sandbox Code Playgroud)
================================
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()
}
Run Code Online (Sandbox Code Playgroud)
相关问题:根据这个使用Django ModelChoice字段创建下拉到查找表?
我已经添加:
tipo_documento = forms.ModelChoiceField(queryset=TipoDocumento.objects.all(),
empty_label=None)
Run Code Online (Sandbox Code Playgroud)
但是当我运行我的应用程序时,我得到:
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
Run Code Online (Sandbox Code Playgroud)
所以,我找到了答案:我需要使用 2 个表单,而不仅仅是 1 个表单,并在“模板”中渲染这两个表单。
脚步:
1.- 除了“CocineraForm”之外,我还需要创建一个附加表单“DocumentoForm”。
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']
Run Code Online (Sandbox Code Playgroud)
2.- 我需要验证两种表单的所有字段。从表单“DocumentoForm”创建一个“Documento”实例,而不将其保存到数据库(commit='False')。我需要将此“Documento”实例作为字段添加到“cocinera”模型中。在这里我应该用“.save()”保存“CocinerForm”。
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('/')
Run Code Online (Sandbox Code Playgroud)
3.- 使用模板中的 2 个表单。
<form action="" method="post">
{% csrf_token %}
{{ cocinera_form }}
{{ documento_form }}
</form>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |