我有一个客户表,其中包含ID,姓名,电话和客户设置为非活动状态的日期(称为“inactive_date”)。
在我的表单中,我只想要一个复选框。如果有日期,则设置复选框。如果日期为空,则不设置复选框。
到目前为止,我可以设置复选框的唯一方法是执行以下操作:
class MyCustomerForm(ModelForm):
inactive_checkbox = forms.BooleanField(initial='checked')
我尝试使用clean或init方法来根据条件设置复选框,但这些尝试下面的尝试都不成功。无论inactive_date的内容是什么,我的表单总是将复选框返回为未设置。
class MyCustomerForm(ModelForm):
inactive_checkbox = forms.BooleanField()
def clean(self, *args, **kwargs):
inactive_date = self.cleaned_data['inactive_date']
if (inactive_date != None):
self.fields['inactive_checkbox'] = 'checked'
return self.cleaned_data
def __init__(self, *args, **kwargs):
super(myCustomerForm, self).__init__(*args, **kwargs)
inactive_date = self.cleaned_data['inactive_date']
if (inactive_date != None):
self.fields['inactive_checkbox'] = 'checked'
class Meta:
model = MyCustomer
fields = ['customer_id','customer_name','customer_phone',
'inactive_checkbox']
知道我的代码有什么问题,或者是否有更好的方法通过复选框控制我的inactive_date?
答案 0 :(得分:0)
尝试初始:
https://docs.djangoproject.com/en/1.8/ref/forms/api/#dynamic-initial-values
在您的视图中检查inactive_date字段的状态,然后通过initial参数将结果传递给表单。
希望它可以提供帮助。
答案 1 :(得分:0)
我想根据jorlugaqui的回答发布我的新表单作为评论,但评论在格式和长度方面非常有限。
所以这是基于jorlugaqui建议的新表格和观点:
新表格:
class MyCustomerForm(ModelForm):
inactive_checkbox = forms.BooleanField(required=False, label="Inactive")
class Meta:
model = MyCustomer
fields = ['customer_id','customer_name','customer_phone']
新观点:
def customer_detail(request):
id = request.GET.get('id')
item = MyCustomer.objects.get(customer_id=id)
if request.method == 'POST':
form = MyCustomerForm(request.POST, instance=item, initial={'inactive_checkbox': item.inactive})
if form.is_valid():
inactive = request.POST.get('inactive_checkbox')
modified_item = form.save(commit=False)
if inactive:
if modified_item.inactive == None:
modified_item.inactive = datetime.datetime.now().strftime("%Y-%m-%d")
else:
modified_item.inactive = None
modified_item.save()
else:
form = MyCustomerForm(initial={'inactive_checkbox': item.inactive}, instance=item)
return render(request, 'basic_detail.html', {'id': id, 'form': form})