表单中的 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
)
我正在尝试通过从表单字段中提取 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
)