【问题标题】:How to change the value of Boolean Field in Model from the views?如何从视图中更改模型中布尔字段的值?
【发布时间】:2020-11-08 04:09:58
【问题描述】:

我一直在使用的应用程序使用

  • 基于类的视图

  • 两个模型,问答。

Question 模型有一个 FileField 来存储该问题的实际解决方案,Answer 模型有一个名为 resultFileField 来存储用户给出的解决方案(由用户解决)。

  • Answer 模型中名为 iscorrect 的布尔字段,默认设置为 False。

我想要

  • 检查两个文件是否相同(问题模型中的解决方案和答案模型中的结果)并且,

  • 切换布尔字段iscorrect(如上所述,此布尔字段存在于答案模型中)。

我的问题归结为什么?

假设我已经弄清楚如何检查两个文件是否相同(在 views.py 中使用 comparator 方法,然后请求特定 id 的问题模型文件,然后检查它们是否相同。公平地说,我还没有实现这一点,因此也将不胜感激),我想知道如何根据我的比较器方法返回的内容( True 或 False )从 views.py 切换 BooleanField。

注意:正如我之前所说,我使用的是基于类的视图,所以请记住这一点,谢谢。

class CoderListView(ListView):
    model = Question
    template_name = "coder/coder_list.html"
    context_object_name = 'question'


class CoderDetailView(DetailView):
    model = Question
    template_name = "coder/coder_detail.html"
    context_object_name = 'question'


class CoderCreateView(CreateView):
    model = Answer
    fields = ['result']
    context_object_name = 'answer'
    template_name = "coder/coder_form.html"

    def get_success_url(self):
        question = self.object.question
        return reverse('coder:detail', kwargs={'pk': question.id})

    def form_valid(self, form):
        form.instance.question = Question.objects.get(id=self.kwargs['qid'])
        return super().form_valid(form)

我想要更改的视图(基于比较器方法的返回值切换布尔字段是 CodeCreateView 因为用户将提交文件,然后我的方法将检查它是否与解决方案相同)。

【问题讨论】:

  • 不完全确定问题是关于什么的。您是在问如何设置答案的is_correct 字段吗?像answer.is_correct = ... 然后answer.save() 这样的东西可以,不是吗?
  • 是的,我在问如何设置该字段以及如何根据特定条件在视图中切换它。
  • 请多分享一下您的观点。否则答案似乎微不足道,只是在上面的评论中,但感觉可能还有更多,但如果没有看到您要解决的代码部分,则不确定。
  • 好吧,我将我的观点添加到问题中。 p.s 目前我还没有准备好比较器方法。

标签: python django django-views


【解决方案1】:

所以你可以在你的 CoderCreateView 中做这样的事情:

    def form_valid(self, form):
        question = Question.objects.get(pk=self.kwargs['qid'])
        form.instance.question = question
        form.instance.question.is_correct = comparator(question.solution, form.instance.result)
        form.instance.question.save()
        return super().form_valid(form)

在您引用的代码中有几处没有意义:

CreateView 将要求您指定form_class 或覆盖.get_form_class() 以获取处理传入数据的表单。您在form_valid 中使用此表单,所以我假设已处理好,但未包含在您的问题中。

假设已经处理好并且表单是 ModelForm,那么上面应该可以工作。

【讨论】:

  • 但是由于我使用的是 CreateView,我认为我不需要使用任何表单类,对吧?如果您传入fields,CreateView 会处理它。另外,form.instance.is_correct 将如何更改模型布尔字段的布尔状态?我不是说它necessraliy没有,但它背后的逻辑是什么?因为在我看来,这样做不应该对模型的领域产生影响,但如果确实如此,那就太好了。我会在尝试后通知您并接受此答案。
  • > "form.instance.is_correct 如何改变我的模型布尔字段的布尔状态" 当你调用 super().form_valid() 时会发生这种情况。这将采用 form.instance 并通过模型将其保存在存储(数据库)中 - 这是 CreateView 提供的逻辑的一部分。
猜你喜欢
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-22
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多