为什么带有auto_now_add的DateTimeField无法进入表单字段

Dik*_*sha 2 python django django-forms

以下是我的模型:

class MyModel(models.Model):
    code = models.CharField(_('Code'), max_length=56, null=False,
                        blank=False, db_column='code')
    name = models.CharField(_('Name'), max_length=128, null=False,
                        db_index=True, db_column='name', blank=False)
    created_at = models.DateTimeField(_('Created At'), null=False,
                                      db_column='created_at', blank=False,
                                      auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)

形成:

class MyForm(forms.Form):
    class Meta:
        model = MyModel 
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

视图

class MyView(View):

    def get(self, request):
        form = MyForm(request=request)
        return render(request, 'test_manager/testrule_form.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)

显示此表单时,我可以看到除created_at之外的所有字段。有谁知道在更新某些对象时如何获取created_at字段?

Wil*_*sem 5

如果指定auto_now=True或auto_now_add=True,那么您editable=False将同时创建该字段。因此,这意味着它不会显示在表单中。

可能的最小变化是default使用函数而不是使用auto_now_add=True属性来指定值,例如:

from django.utils import timezone as tz

class TestRule(models.Model):
    code = models.CharField(_('Code'), max_length=56, null=False,
                        blank=False, db_column='code')
    name = models.CharField(_('Name'), max_length=128, null=False,
                        db_index=True, db_column='name', blank=False)
    created_at = models.DateTimeField(_('Created At'), null=False,
                                      db_column='created_at', blank=False,
                                      default=tz.now)
Run Code Online (Sandbox Code Playgroud)

注意,我们不调用该now(..)函数。如果这样做,那么我们将created_at在构建模型(而不是模型的实例)时将该列设置为时间戳。通过传递对now(..)函数的引用,添加新的模型实例时将调用该函数。