【问题标题】:Conditional checks not working while processing form in Django在 Django 中处理表单时条件检查不起作用
【发布时间】:2019-08-01 12:11:00
【问题描述】:

我有一个 ModelForm (EditGoalForm),我用它来编辑模型的实例 (Goal)。在保存表单数据之前必须满足一些条件。我使用 if 语句来检查这些条件,它仍然保存,而不是给出错误 - 就像 if 语句什么都不做。

我有以下几点: models.py

class Goal(models.Model):
    goal_name = models.CharField(max_length=250)
    goal_status = models.ForeignKey(GoalStatus, on_delete=models.CASCADE, related_name='goal_status')
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='scrumy_goal_user')

class GoalStatus(models.Model):
    status_name = models.CharField(max_length=250)

forms.py

class EditGoalForm(forms.ModelForm):
    goal_status = forms.ModelChoiceField(queryset=GoalStatus.objects.all(), empty_label="Select Goal Status")

    class Meta:
        model = Goal
        fields = ('goal_status',)

views.py

def move_goal(request, goal_id):
    goal_instance = Goal.objects.get(goal_id=goal_id)

    ERROR_MESSAGE = '''BlahBlahBlah'''

    has_perm_cannot_move_to_done = request.user.has_perm('application.cannot_move_to_done')
    has_perm_can_move_goal_anywhere = request.user.has_perm('application.can_move_goal_anywhere')
    has_perm_can_move_someones_goal_from_verify_to_done = request.user.has_perm('application.can_move_someones_goal_from_verify_to_done')
    has_perm_can_move_anybodys_goal_to_any_column = request.user.has_perm('application.can_move_anybodys_goal_to_any_column')

    if request.method == 'POST':
        form = EditGoalForm(request.POST, instance=goal_instance)
        if form.is_valid():
            if (has_perm_cannot_move_to_done and form.cleaned_data['goal_status'] != 'Done Goal'):
                form.save()
                messages.success(request, 'Goal Update Successful')
                return redirect('home')
            else:
                messages.error(request, ERROR_MESSAGE)
    else:
        form = EditGoalForm(instance=goal_instance)
    return render(request, 'move_goal.html', {'form': form})

if form.is_valid之后,我检查了认证用户是否有权限,以及goal_status字段是否没有设置为Done Goal。如果两者都为真,则保存。但是,如果我将goal_status 字段设置为Done Goal,它仍然会保存而不是显示错误消息。有什么问题?

【问题讨论】:

  • 你能分享一下你的 GoalStatus 模型吗
  • 你尝试过什么样的调试?你试过print一些变量吗?您是否尝试过使用分步调试器?
  • @cagrias 我已经用 GoalStatus 模型更新了问题
  • @DeepSpace 是的,我已经打印了一些变量。但是,我还没有尝试过分步调试器
  • @Caspian 你的输出是什么?如果form.cleaned_data['goal_status'] 不是'Done Goal' 则不可能执行if

标签: django python-3.x django-views django-2.2


【解决方案1】:

form.cleaned_data['goal_status']GoalStatus 的一个实例。它永远不能等于字符串'Goal Done',除非您:

  • 实现__eq__(和/或)__ne__

    def __eq__(self, other):
        return self.status_name == other
    
  • 只比较你真正想比较的:

    form.cleaned_data['goal_status'].status_name != 'Done Goal'
    

【讨论】:

    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多