如何从Django中的另一个属性派生属性

问题描述 投票:0回答:1

[这是我第一个使用Django文档进行实验的项目:Person模型。还有两个特色视图(一个用于创建人员,另一个用于查看已创建人员的列表)。到目前为止,一个人只有两个CharFieldsfirst_namelast_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模型。还有两个特色视图(一个用于创建人员,另一个用于查看已创建人员的列表)。 ...

django attributes derived
1个回答
1
投票

我的想法是将这样的计算结果放入您的views.py中,用户在其中将其date_of_birth输入到表单中。在他提交表单后,它将计算用户是>还是<18/21,并相应地为adult返回true / false。然后将其推送到您的模型。或者,您可以实现一种逻辑,当用户输入adult时,该逻辑会自动在视图的表单中显示no adultdate_of_birth。确实取决于您想要的解决方案。用户应该在输入后立即看到成人

© www.soinside.com 2019 - 2024. All rights reserved.