【发布时间】:2019-01-10 12:54:24
【问题描述】:
我有这个 UpdateView 用来更新我的频道:
class ChannelUpdate(UpdateView, ProgramContextMixin):
model = ChannelCategory
form_class = ChannelForm
template_name = 'app/templates/channel/form.html'
def dispatch(self, request, *args, **kwargs):
return super(ChannelUpdate, self).dispatch(request, *args, **kwargs)
def get_success_url(self):
return reverse('channel_index', args=[self.get_program_id()])
def get_context_data(self, **kwargs):
context = super(ChannelUpdate, self).get_context_data(**kwargs)
context.update({
'is_new': False,
})
return context
def form_valid(self, form):
channel = Channel.objects.get(id=self.kwargs['pk'])
channel_codes = ChannelCodes.objects.filter(channel_id=channel.pk)
if 'is_channel_enabled' in form.changed_data:
for channel_code in channel_codes:
channel_code.is_active = channel.is_channel_enabled
channel_code.save()
return super(ChannelUpdate, self).form_valid(form)
因此,当我编辑频道时,我有一个复选框,它将我的模型字段 is_channel_enabled 的布尔值更改为 True 或 False。如果这样做,我会在 def form_valid 方法中触发我的 if 语句,然后循环遍历我的所有 channel_code 并将它们的 bool 字段 is_active 设置为与我的 Channel 中的 bool 字段 is_channel_enabled 相同的值。
但我现在的问题是:假设我取消选中该框,保存表单后,布尔值仍然是 True,即使我已取消选中该框并且它应该是 False,但如果我随后编辑我的再次通道并选中该框,布尔值更改为False,因此每次我选中该框时,都会发生完全相反的情况:选中框= False,未选中框= True。
但这也只会在我进行更新时发生。如果我创建通道,True 的默认值是正确的,只有当我开始编辑它时,才会保存错误的值。有人知道我的问题在哪里吗?我是不是用错了 form_valid?
感谢您的帮助!
【问题讨论】:
-
你不应该使用
form.cleaned_data,而不是form.changed_data,比如form.cleaned_data['is_channel_enabled']吗? -
@WillemVanOnsem 我查找了如何检查模型字段中的更改,发现
changed_data是这样做的方法,cleaned_data 也会这样做吗? -
但
form不是模型,它是Form。 -
@WillemVanOnsem 好吧,我试了一下,但我收到的是错误
argument of type 'bool' is not iterable:/ 我对 Django 很陌生,如果我误解了一些东西,很抱歉 -
使用
if form.cleaned_data['is_channel_enabled']:。