django - POST后改变表单数据

时间:2016-05-17 14:10:15

标签: django

我试图在用户填写表单后更改数据。但是,我想让面向前方的用户轻松点击单选按钮,但在后端输入所需的信息。

这里我试图获取一个日期输入,我想让用户选择今天'或者'另一天'。今天'今天'如果选中,我希望数据库捕获该特定日期的日期。我的代码如下:

#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时立即捕获,在这种情况下,'今天'是定义的选择。有没有办法改变变化'今天'当它保存到数据库时进入实际日期本身?

2 个答案:

答案 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>的信息