我试图在用户填写表单后更改数据。但是,我想让面向前方的用户轻松点击单选按钮,但在后端输入所需的信息。
这里我试图获取一个日期输入,我想让用户选择今天'或者'另一天'。今天'今天'如果选中,我希望数据库捕获该特定日期的日期。我的代码如下:
#models.py
DATE_CHOICES = (
('Today', 'Today'),
('Other days', 'Other days'),
)
class Mileage(models.Model):
date = models.CharField(max_length=30, choices= DATE_CHOICES)
def __str__(self): # __unicode__ on Python 2
return self.date
class MileageForm(ModelForm):
date = forms.ChoiceField(choices=DATE_CHOICES, widget=forms.RadioSelect)
class Meta:
model = Mileage
fields = ['date']
#views.py
def home(request):
form = MileageForm(request.POST or None)
context = {
"form": form,
}
if form.is_valid():
if form.cleaned_data.get('date') == "Today":
form.cleaned_data["date"]= time.strftime("%d/%m/%Y")
form.save()
form = MileageForm()
context = {
"form": form,
}
return render(request, 'home.html', context)
我知道输入会在POST时立即捕获,在这种情况下,'今天'是定义的选择。有没有办法改变变化'今天'当它保存到数据库时进入实际日期本身?
答案 0 :(得分:0)
使用DateField代替使用CharField,并在今天的情况下应用datetime.today()
。
您的代码应如下所示:
models.py
DATE_CHOICES = (
('Today', 'Today'),
('Other days', 'Other days'),
)
class Mileage(models.Model):
date = models.DateField('Date')
def __str__(self): # __unicode__ on Python 2
return self.date
class MileageForm(ModelForm):
date = forms.DateField()
class Meta:
model = Mileage
fields = ['date']
views.py
from datetime import datetime
def home(request):
form = MileageForm(request.POST or None)
context = {
"form": form,
}
if form.is_valid():
if form.cleaned_data.get('date') == "Today":
form.cleaned_data["date"]= datetime.today()
form.save()
form = MileageForm()
context = {
"form": form,
}
return render(request, 'home.html', context)
答案 1 :(得分:0)
您无需更改POST
数据。
Django通过获取输入数据(通常为POST
)并通过clean
机制将它们转换为python数据来形成工作。有用于单独清洁每个区域的钩子。
因此,您的表单的clean_date
方法可以将'Today'
转换为date.today()
。 E.g:
class MileageForm(ModelForm):
def clean_date(self):
user_input = self.cleaned_data.get('date')
if user_input == 'Today':
return date.today()
...
您可以在https://docs.djangoproject.com/en/1.9/ref/forms/validation/
了解更多有关Django表单'clean_<field name>
的信息