我是一个新手,我卡住了,而试图填充一个列表中的记录在我的表(mysql),我的想法是从Marcasmodelos获取此数据,并使用它作为与另一个字段发布到我的表“Modelos”.但是无论何时渲染,都不会发生任何事情,它只显示默认选项。
以下是我的代码:
models.py
class Marcasmodelos(models.Model):
marca = models.CharField(db_column='Marca', primary_key=True, max_length=20) # Field name made lowercase.
class Meta:
managed = False
db_table = 'marcasmodelos'
class Modelos(models.Model):
modelo = models.CharField(db_column='Modelo', primary_key=True, max_length=45) # Field name made lowercase.
marca = models.CharField(db_column='Marca', max_length=45) # Field name made lowercase.
class Meta:
managed = False
db_table = 'modelos'
forms.py
class MarcasForms(forms.ModelForm):
class Meta:
marca=Marcasmodelos
fields= '__all__'
class ModeloForm(forms.Form):
marca = forms.ModelChoiceField(queryset=Marcasmodelos.objects.all().values(), widget=forms.Select(attrs={'class': 'custom-select'}))
modelo = forms.CharField(max_length=100)
formModelos.html(我的表单)
<form enctype="multipart/form-data" method="post">
{% csrf_token %}
<div class="container">
<div class="row">
<div class="form-group">
<div class="mb-3">
<label for="marca">Marca:</label>
<select name="marca" class="form-control custom-select" id="marca">
<option value="">Selecciona una marca</option>
{% for marca in marcas %}
<option value="{{ marca.id }}">{{ marca }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="col-fluid">
<div class="mb-3">
<label for="modelo" class="form-label">Modelo</label>
<input type="{{ campo.field.widget.input_type }}"
class="form-control"
id="modelo"
name="modelo"
placeholder="Modelo del Producto">
{% if campo.errors %}
<div class="invalid-feedback">{{ campo.errors }}</div>
{% endif %}
</div>
</div>
</div>
</div>
<br>
<button type="submit" class="btn btn-primary">Guardar</button>
<button type="button" class="btn btn-danger" id="cancelButton">Cancelar</button>
CargaModelos.html(我的模板)
{% extends 'master.html' %}
{% block title %}
Carga Modelos
{% endblock %}
{% block head %}
{% endblock %}
{% block content %}
<div class="container mt-4">
<div class="card mx-auto">
{% csrf_token %}
<div class="card-header">
Ingresar nuevo Modelo
</div>
<div class="card-body">
{% include 'Compras/formModelos.html' %}
</div>
<div class="card-footer text-muted"></div>
</div>
</div>
{% endblock %}
views.py
def CargarMarcas(request):
CargaMarca = MarcasForms(request.POST or None)
if CargaMarca.is_valid():
CargaMarca.save()
return render (request, 'Compras/Marcas.html')
def CargarModelos(request):
if request.method == 'POST':
form = ModeloForm(request.POST)
if form.is_valid():
marca_id = form.cleaned_data['marca']
marca = Marcasmodelos.objects.get(id=marca_id)
modelo = form.cleaned_data['modelo']
Modelos.objects.create(marca=marca, modelo=modelo)
return redirect('modelos_lista')
else:
form = ModeloForm()
return render (request, 'Compras/CargaModelos.html', {'form': form})
我试图从表Marcasmodelos中获得选择的选项,问题是它没有任何作用,我在MySQL工作台中的表已经从CargarMarcas中获得了7条记录,但现在我无法将它们显示在我的选择中。
1条答案
按热度按时间acruukt91#
我认为在很多层面上都可以有所改进。首先,我们可以使用一个
ForeignKey
,甚至(甚至可能是特别的),因为它是不受管理的:现在,我们可以很容易地将其转换为
ModelForm
:我们甚至可以定义小部件:
那就不再是我们的问题了
这样的形式也更简洁:
使用
ForeignKey
不仅可以使ModelForm
更容易生成,而且还可以使ORM更具表现力,因为我们可以在ForeignKey
之后定义JOIN等。注意:虽然大多数表单不处理媒体文件,但最好还是将**
request.FILES
**[Django-doc]传递给表单,这样,如果您稍后添加额外的媒体字段,所有使用表单的视图都会正确处理文件。注意:函数通常使用 snake_case 编写,而不是 PascalCase,因此建议将函数重命名为
CargarModelos
,而不是cargar_modelos
。