Django forms 不显示auto_now时间字段
在Django中,我们经常会使用模型来存储数据,而使用表单来处理前端用户输入的数据。在某些情况下,我们希望在创建或更新模型实例时自动设置时间字段为当前时间,这时可以使用Django的auto_now
选项来实现。但是,有时候我们并不希望在表单中显示这个时间字段。
本文将详细介绍如何在Django中定义模型时使用auto_now
选项,并在表单中不显示这个时间字段。我们将通过一个简单的示例来演示这个过程。
定义模型
首先,我们需要定义一个包含时间字段的模型,并使用auto_now=True
选项来自动设置时间字段为当前时间。在这个示例中,我们定义一个名为Post
的模型,其中包含title
和content
字段,以及一个用于记录创建时间的created_at
字段:
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
在上面的代码中,我们定义了一个简单的Post
模型,并使用auto_now=True
选项为created_at
字段设置了自动当前时间。
创建表单
接下来,我们需要创建一个表单来处理用户输入的数据。在这个示例中,我们定义一个名为PostForm
的表单,用于用户输入title
和content
字段:
from django import forms
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = ['title', 'content']
在上面的代码中,我们定义了一个简单的PostForm
表单,并指定了要显示的字段为title
和content
。但是,由于我们没有指定created_at
字段,它将不会显示在表单中。
视图函数
接下来,我们需要创建一个视图函数来处理表单的提交,并保存数据到数据库中。在这个示例中,我们定义一个名为create_post
的视图函数:
from django.shortcuts import render, redirect
from .forms import PostForm
def create_post(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
form.save()
return redirect('post_list')
else:
form = PostForm()
return render(request, 'create_post.html', {'form': form})
在上面的代码中,我们处理了表单的提交,并将数据保存到数据库中。如果用户提交的数据有效,我们将重定向到post_list
页面。
模板
最后,我们需要创建一个模板来呈现表单给用户。在这个示例中,我们创建一个名为create_post.html
的模板:
<!DOCTYPE html>
<html>
<head>
<title>Create Post</title>
</head>
<body>
<h1>Create Post</h1>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
</body>
</html>
在上面的代码中,我们使用form.as_p
将表单字段以<p>
标签形式显示在页面上。
运行结果
现在,我们已经完成了整个流程。当用户访问/create_post
页面时,他们将看到一个表单,其中包含title
和content
字段。用户填写表单并提交后,数据将保存到数据库中,同时created_at
字段将自动设置为当前时间。
在这个示例中,我们成功地使用了Django的auto_now
选项为模型设置了一个自动设置时间字段,并在表单中不显示这个字段。