表单中的 Django ValueError

Django ValueError in form

我正在尝试通过从表单字段中提取 post 数据并将其插入我的视图来提交表单。

我有以下型号

class ExerciseEdl(models.Model):
    unit = models.ForeignKey(Units, models.CASCADE)
    exercise = models.ForeignKey(Exercises, models.CASCADE)
    equipment = models.ForeignKey(Equipment, models.CASCADE)
    quantity = models.IntegerField()
    location = models.ForeignKey(Locations, models.SET('Unassigned'), db_column='location')

以及下面的观点

def add_edl_item(request, unit_pk, ex_pk, *args, **kwargs):
    ex_instance = Exercises.objects.get(pk=ex_pk)
    unit_instance = Units.objects.get(pk=unit_pk)

    if request.method == "POST":
        print(request.POST)
        ExerciseEdl.objects.update_or_create(
            unit=unit_instance,
            exercise=ex_instance,
            equipment=request.POST.get('equipment'),
            quantity=request.POST.get('quantity'),
            location=request.POST.get('location')
        )
        messages.success(
            request, f'{unit_instance.unit_name} EDL for {ex_instance.exercise} successfully updated')
        return redirect('exercise-equipment', ex_pk=ex_pk, unit_pk=unit_pk)

    else:
        messages.error(
            request, f'Failed to update the {unit_instance.unit_name} EDL for {ex_instance.exercise}.')

我正在使用此表单中的数据输入设备、数量和位置字段。

<form action="{% url 'add-edl-item' ex_pk=ex_instance.id unit_pk=unit_instance.id %}" method="post">
                  {% csrf_token %}

                  <label for="equipment">Equipment</label>
                    <select class="form-control" id="id_equipment" name="equipment">
                      {% for equip in equip_list %}
                    <option value="{{equip.id}}">{{equip.tamcn}} - {{equip.nomen}}</option>
                      {% endfor %}
                    </select>

                  <div class="mb-3">
                    <label for="quantity" class="form-label">Quantity</label>
                    <input id= "id_quantity" type="number" class="form-control" name="quantity">
                  </div>

                  <div class="mb-3">
                    <label for="location">Location</label>
                    <select class="form-control" id="id_location" name="location" value="">
                      {% for loc in locations %}
                    <option value="{{loc.id}}">{{loc.location}}</option>
                      {% endfor %}
                    </select>

                  </div>
                  <input class="btn btn-primary" type="submit" value="Submit">
              </form>

数量没问题,只是一个整数,其他两个字段,报如下错误

ValueError: Cannot assign "'6'": "ExerciseEdl.equipment" must be a "Equipment" instance.

其中 6 只是所选选项之一的 ID。如果我在提交表单之前选择了另一个选项,它将是该选项的 ID,这同样适用于位置字段。在模板中使用 pk 而不是 id returns 同样的错误。

我认为 6 周围的双引号内的单引号可能是问题所在,所以我为这两个字段设置了一个静态值,它返回了相同的错误,但用“6”代替了“'6'” ".

我还 运行 vscode 中的调试器,在视图的每一行都设置了断点并提交了表单,但它跳过了 update_or_create 函数而不返回任何信息.

print(request.POST) 打印这个:

<QueryDict: {'csrfmiddlewaretoken': ['03E5KcrhBapq7dkClg4JTcomzYQy32bskkDwWe5474cD3ITgS8kb88HtDIZzeRZw'], 'equipment': ['6'], 'quantity': ['12'], 'location': ['1']}>

在模板中使用 equip 而不是 equip.id returns 这个错误

ValueError: Field 'id' expected a number but got 'A00267G'.

它说它想要一个整数,但不会接受一个。

您需要获取设备实例和位置实例。确保 id 是整数并获取两个模型的实例。

equipment_obj = Equipment.objects.get(id=request.POST.get('equipment'))
location_obj = Locations.objects.get(id=request.POST.get('location'))
ExerciseEdl.objects.update_or_create(
    unit=unit_instance,
    exercise=ex_instance,
    equipment=equipment_obj,
    quantity=request.POST.get('quantity'),
    location=location_obj
)