如何从Django的纯HTML中的选择选项值返回int

时间:2019-06-15 10:49:06

标签: python django django-templates django-views

我有一个普通的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”实例。

1 个答案:

答案 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,应该相应地命名。