首页 > 解决方案 > 如何从 django 的纯 html 中的选择选项值返回 int

问题描述

我有一个包含选择选项的纯 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})

我希望选择选项的值是整数,例如 1,而不是字符串,例如“1”。所以我得到这个错误: 异常类型:ValueError 异常值:

无法分配“1”:“ScrummyGoals.target_name”必须是“GoalStatus”实例。

标签: pythondjangodjango-templatesdjango-views

解决方案


尝试改变

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后缀。这些不是“名称”——它们是指向其他模型实例的链接。所以第一个指向targetviatarget_id值,第二个指向userviauser_id值并且应该相应地命名。


推荐阅读