我有一个普通的html表单,其中包含一个选择选项,该选择选项值应返回一个要存储在数据库中的int。
我尝试在视图中将值转换为int,但仍然无法正常工作。
这是ScrummyGoals模型
class ScrummyGoals(models.Model):
user_name = models.ForeignKey(ScrummyUser, on_delete=models.CASCADE)
#goal_status = models.ForeignKey(GoalStatus, on_delete=models.CASCADE)
task = models.CharField(max_length=200)
#task_target = models.CharField(max_length=30)
target_name = models.ForeignKey(GoalStatus, on_delete=models.CASCADE, default=1, related_name="scrummygoals")
def __str__(self):
return self.task
这是我用来填充选择选项的模型。
class GoalStatus(models.Model):
target = models.CharField(max_length=100, choices=target, default="Week")
def __str__(self):
return self.target
这是html表单
<form action="" method="post">
{% csrf_token %}
<div class="form-group">
<label for="task">Task</label>
<input type="text" class="form-control" id="task" name="task">
</div>
<div class="form-group">
<label for="task">Goal</label>
<select name="goal" class="form-control">
{% for goal in goal %}
<option value='{{goal.id | to_int }}'>{{goal.target}}</option>
{% endfor %}
</select>
</div>
<button type="submit" class="btn btn-primary">Create task</button>
</form>
这是我正在获取发布请求并将其保存到数据库的视图。
def user_add_task(request):
goal = GoalStatus.objects.all()
if request.method == 'POST':
if request.POST.get('task') and request.POST.get('goal'):
task = ScrummyGoals()
task.target_name = int(request.POST.get('goal'))
task.user_name = request.user.scrummyuser.id
task.task = request.POST.get('task')
task.save()
return redirect('myapp:home')
return render(request, 'myapp/user_add_task.html', {'goal':goal})
我希望select选项的值是一个整数,例如1,而不是字符串,例如“ 1”。 所以我得到这个错误: 异常类型:ValueError 异常值:
无法分配“ 1”:“ ScrummyGoals.target_name”必须是“ GoalStatus”实例。
答案 0 :(得分:1)
尝试更改
task.target_name = int(request.POST.get('goal'))
task.user_name = request.user.scrummyuser.id
到
task.target_name_id = int(request.POST.get('goal'))
task.user_name_id = request.user.scrummyuser.id
或
task.target_name = GoalStatus.objects.get(pk=request.POST.get('goal'), )
task.user_name = request.user.scrummyuser
我建议重命名两个FK字段:删除_name
后缀。这些不是“名称”,而是指向其他模型实例的链接。因此,第一个通过target
值指向target_id
,第二个通过user
值指向user_id
,应该相应地命名。