django 用我的一个表(已经在Models.py中)中的选项填充列表的问题

azpvetkf  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(113)

我是一个新手,我卡住了,而试图填充一个列表中的记录在我的表(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条记录,但现在我无法将它们显示在我的选择中。

acruukt9

acruukt91#

我认为在很多层面上都可以有所改进。首先,我们可以使用一个ForeignKey,甚至(甚至可能是特别的),因为它是不受管理的:

class Modelos(models.Model):
    modelo = models.CharField(db_column='Modelo', primary_key=True, max_length=45)
    marca = models.ForeignKey(db_column='Marca', to_field='marca', max_length=20)

    class Meta:
        managed = False
        db_table = 'modelos'

现在,我们可以很容易地将其转换为ModelForm

class MarcasForms(forms.ModelForm):
    class Meta:
        model = Modelos
        fields = '__all__'

我们甚至可以定义小部件:

class MarcasForms(forms.ModelForm):
    class Meta:
        model = Modelos
        fields = '__all__'
        widgets = {'marca': forms.Select(attrs={'class': 'custom-select'})}

那就不再是我们的问题了
这样的形式也更简洁:

def CargarModelos(request):
    if request.method == 'POST':
        form = ModeloForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return redirect('modelos_lista')
    else:
        form = ModeloForm()
    return render(request, 'Compras/CargaModelos.html', {'form': form})

使用ForeignKey不仅可以使ModelForm更容易生成,而且还可以使ORM更具表现力,因为我们可以在ForeignKey之后定义JOIN等。

注意:虽然大多数表单不处理媒体文件,但最好还是将**request.FILES**[Django-doc]传递给表单,这样,如果您稍后添加额外的媒体字段,所有使用表单的视图都会正确处理文件。
注意:函数通常使用 snake_case 编写,而不是 PascalCase,因此建议将函数重命名为CargarModelos,而不是cargar_modelos

相关问题