[这是我第一个使用Django文档进行实验的项目:Person
模型。还有两个特色视图(一个用于创建人员,另一个用于查看已创建人员的列表)。到目前为止,一个人只有两个CharFields
,first_name
和last_name
。
[我现在想做的是实现一个BooleanField
adult
,如果今天的日期和出生日期之间的差大于或等于18(或16),则返回True
,没关系)。
可能我还将基于相同原理实现属性age
。显然,从adult
导出age
是完全可以的。
如何在Django中实现?我应该在哪里编写使数学推导adult/age
的代码?在models.py,forms.py,views.py内部还是在模板内部?
P.S。我知道看到age
属性被声明为DurationField看起来很奇怪,但是正如我所说的,我正在尝试尝试不同的属性字段。如果我的问题的答案要求将其更改为例如PositiveInteger
,则我不介意更改它。
我的models.py看起来像这样
from django.db import models
# Create your models here.
class Person(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=30)
adult = models.BooleanField(default=False)
date_of_birth = models.DateField(default=None)
created_on = models.DateTimeField(auto_now_add=True, auto_now=False)
updated_on = models.DateTimeField(auto_now_add=False, auto_now=True)
age = models.DurationField(default=None)
我的forms.py如下
from django import forms
from .models import Person
class CreatePersonForm(forms.ModelForm):
class Meta:
model = Person
fields = [
'first_name',
'last_name',
'adult',
'date_of_birth',
'age',
]
这是我的views.py
from django.shortcuts import render
from .models import Person
from .forms import CreatePersonForm
# Create your views here.
def home_view(request):
return render(request, 'home.html')
def persons_list_view(request):
persons = Person.objects.all()
context = {
'persons': persons
}
return render(request, 'persons_list.html', context)
def create_person_view(request):
if request.method == 'POST':
form = CreatePersonForm(request.POST)
persons = Person.objects.all()
context = {
'persons': persons
}
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return render(request, 'persons_list.html', context)
else:
form = CreatePersonForm()
context = {'form': form}
return render(request, 'create_person.html', context)
感谢您的任何帮助
编辑
我可以按照建议在views.py中编写减法,并运行所有迁移,但是当我尝试在本地主机上创建新人时,出现以下错误:
Exception Type: TypeError
Exception Value:
unsupported operand type(s) for -: 'DeferredAttribute' and 'DeferredAttribute'
这似乎是由这行代码if (Person.date_today - Person.date_of_birth) >= 18:
引起的。我还尝试了this解决方案,该解决方案涉及models.py而不是views.py,但是出现了相同的错误。我也在尝试在Django文档中找到某些内容,但是我不得不说这并不是“初学者友好的”。
也许我应该提一下,我只具备基本的Python知识,所以我可能做得太过分了。
我忘记上传我编写的代码:
def create_person_view(request):
if (Person.date_today - Person.date_of_birth) >= 18:
Person.adult=True
if request.method == 'POST':
form = CreatePersonForm(request.POST)
persons = Person.objects.all()
context = {
'persons': persons
}
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return render(request, 'persons_list.html', context)
else:
form = CreatePersonForm()
context = {'form': form}
return render(request, 'create_person.html', context)
这就是我在models.py中所做的
class Person(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=30)
adult = models.BooleanField(default=False)
date_of_birth = models.DateField(default=None)
date_today = models.DateField(auto_now=True)
编辑2
我现在正在尝试使用python文档中的this解决方案(在方法部分中,重新排列婴儿潮时期的状态),但是,该解决方案在models.py而不是views.py中进行计算(如注释中的建议)这个问题)。
所以我尝试了类似的东西:
class Person(models.Model): first_name = models.CharField(max_length=20) last_name = models.CharField(max_length=30) adult = models.BooleanField(default=False) date_of_birth = models.DateField(default=None) def __str__(self): return '%s %s' % (self.first_name, self.last_name) def is_adult(self): import datetime if (datetime.date.today() - self.date_of_birth) > datetime.timedelta(days=18*365): self.adult = True
这次我没有收到任何错误,但是当我尝试创建一个由1985-04-28年出生的人并由管理员保存时,成年人仍然是假的。有谁知道如何实际执行此操作?
[这是我第一个使用Django文档进行实验的项目:Person模型。还有两个特色视图(一个用于创建人员,另一个用于查看已创建人员的列表)。 ...
我的想法是将这样的计算结果放入您的views.py中,用户在其中将其date_of_birth
输入到表单中。在他提交表单后,它将计算用户是>还是<18/21,并相应地为adult
返回true / false。然后将其推送到您的模型。或者,您可以实现一种逻辑,当用户输入adult
时,该逻辑会自动在视图的表单中显示no adult
或date_of_birth
。确实取决于您想要的解决方案。用户应该在输入后立即看到成人