首页 > 解决方案 > 在 Django 表单中修改下拉菜单选项

问题描述

我有一个下拉菜单,我用它来填写表单上的字段,但是,由于我刚从 django 和 html 开始,我正在使用另一个表单来编辑和更新前一个表单的数据。但我不能让下拉菜单在第二种形式上工作。

该模型:

class Orden(models.Model):
    STATUS = (
        ('En espera', 'En espera'),
        ('En proceso', 'En proceso'),
        ('Terminado', 'Terminado'),
        ('Entregado', 'Entregado'),
        )
    num_orden = models.CharField(max_length=20, default='')
    fechain = models.CharField(max_length=30, default='')
    fechaout = models.CharField(max_length=30, default='')
    instrumento = models.CharField(max_length=30, default='')
    marca = models.CharField(max_length=20)
    referencia = models.CharField(max_length=30, default='')
    serial = models.CharField(max_length=15, default='')
    encargado = models.CharField(max_length=50, default='')
    abono = models.CharField(max_length=15, default='')
    procesos = models.TextField(default='')
    estado = models.CharField(max_length=50, null=True, choices=STATUS) # <--- This one
    client = models.ForeignKey(Cliente, on_delete=models.CASCADE, default='', related_name="client")

与第一种形式相关的视图:

def ordenfill(request, client_id):
    if request.method == 'POST':
        orden = ordenForm(request.POST)
        if orden.is_valid():

            orden.instance.client_id = client_id
            init = orden.save()
            return redirect('ordenview', id=init.id)
    else:
        orden = ordenForm()

    client = Cliente.objects.get(id=client_id)

    context = {
        'orden': orden,
        'client': client,
    }

    return render(request, 'ordenfill.html', context)

与该下拉菜单关联的模板部分:

<form method="POST" class="post-form" action="{% url 'ordenfill' client.id %}">
     {% csrf_token %}
     <div class="container">
        <br>
         .
         .
         .
         <div class="form-group row">
            <label class="col-sm-2 col-form-label">Estado</label>
            <div class="col-sm-4">
                {{orden.estado}}
            </div>
        </div>
    </div>
</form>

第一种形式的图像

第一个表单上的下拉菜单

与第二种形式相关的观点:

def ordenupd(request, id):
    orden = Orden.objects.get(id=id)
    status = Orden.STATUS
    context = {
        'orden': orden,
        'status': status,
    }

    return render(request, "ordenupd.html", context)

编辑:以第二种形式保存更改的视图

def ordenmod(request, id):
    orden = get_object_or_404(Orden, id=id)

    if request.method == 'GET':
        orden = ordenForm(instance=orden)
        return redirect("ordenview", id=id)

    else:

        orden = ordenForm(request.POST, instance=orden)
        print(orden.errors)
        if orden.is_valid():
            orden.save()
            return redirect("ordenview", id=id)
        else:
            orden = clienteForm()
            return redirect("ordenview", id=id)

与该视图的下拉菜单关联的模板部分:

<form method="POST" class="post-form" action="/ordenmod/{{orden.id}}">
     <input type="hidden" name="id" id="id" required maxlength="20" value="{{orden.id}}"/>
           {% csrf_token %}
           <div class="container">
               <br>
               <div class="form-group row">
                    <label class="col-sm-2 col-form-label">Estado</label>
                    <div class="col-sm-4">
                        <select name="select_path" id="select_path">
                            <option value="{{orden.estado}}">{{orden.estado}}</option>
                            {% for items in status %}
                                <option value ="{{orden.estado}}">{{orden.estado}}</option>
                            {% endfor %}
                        </select>
                    </div>
                </div>
            </div>
</form>

该视图的网页:

第二种形式的下拉菜单

如何使第二个表单上的下拉菜单像第一个表单上的那样工作?

标签: htmljquerydjangotemplates

解决方案


#chnage 你的视图如下

from .models import STATUS 
def ordenupd(request, id):
    status = STATUS
    context = {
        'status': status,
    }
  return render(request, "ordenupd.html", context)

#更改您的 HTML 表单模板,如下所示

<form method="POST" class="post-form" action="/ordenmod/{{orden.id}}">
         <input type="hidden" name="id" id="id" required maxlength="20" value="{{orden.id}}"/>
               {% csrf_token %}
               <div class="container">
                   <br>
                   <div class="form-group row">
                        <label class="col-sm-2 col-form-label">Estado</label>
                        <div class="col-sm-4">
                            <select name="select_path" id="select_path">
                                
                                {% for items in status %}
                                    <option value ="{{item.1}}">{{item.1}}</option>
                                {% endfor %}
                            </select>
                        </div>
                    </div>
                </div>
    </form>

推荐阅读