Django:每次更新表单时更新上下文值

时间:2019-11-06 15:30:13

标签: python django

我有一个UpdateView,我正在使用它来更新模型中的某些数据,但是我只想给我的用户最大的次数,他们使用完所有的“更新”后就不应该这样做成为可能。我的看法是这样的:

class TeamUpdate(UpdateView):
    model = Team
    template_name = 'team/team_update_form.html'
    context_object_name = 'team'
    form_class = TeamUpdateForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context.update({
            'max_updates': 2
        })
        return context

    def form_valid(self, form, **kwargs):
        team = form.save()
        // update context somehow so that it has the new value for max_updates?
        messages.success(self.request, f'{team} was updated')
        return redirect(team.get_absolute_url())

我现在的问题是我不知道每次表单更新时如何动态更新上下文。我该怎么做?我认为必须删除硬编码的“ 2”,并且可能必须执行类似2 if not value_from_form else value_from_form的操作,但是如何获得此value_from_form?并且我可以在调度中使用该值来检查其值是否为零,然后使用警告消息将我的用户重定向回,例如“对不起,您已经用光了该团队的所有更新!”。感谢任何回答!

1 个答案:

答案 0 :(得分:1)

我认为应该在Team模型中存储一个最大更新数的字段。像这样:

class Team(models.Model):
   updated = models.IntegerField(default=0)

   def save(self, *args, **kwargs):
        if self.updated:
            self.updated += 1
        else:
            self.updated = 0
        super().save(*args, **kwargs)

最后在settings.py中,有一个变量MAX_UPDATES_FOR_TEAM=2。然后在上下文中,您可以简单地输入:

def get_context_data(self):
    context = super().get_context_data()
    updated = self.object.updated
    context.update({
            'max_updates': settings.MAX_UPDATES_FOR_TEAM - updated
    })
    return context

最后,如果updated的值超过MAX_UPDATES_FOR_TEAM

,请阻止Form更新
 class TeamForm(forms.ModelForm):
     ...
     def clean(self):
         if self.instance.updated >= settings.MAX_UPDATES_FOR_TEAM:
              raise ValidationError("Exceeded max update limit")