我有一个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
?并且我可以在调度中使用该值来检查其值是否为零,然后使用警告消息将我的用户重定向回,例如“对不起,您已经用光了该团队的所有更新!”。感谢任何回答!
答案 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
class TeamForm(forms.ModelForm):
...
def clean(self):
if self.instance.updated >= settings.MAX_UPDATES_FOR_TEAM:
raise ValidationError("Exceeded max update limit")