django - Django UpdateForm DateInput 小部件不显示日期
问题描述
我正在使用 DateInput 小部件在输入日期字段时提供日期选择器。但是,在我的更新表单中,该表单会提取该记录的所有数据,日期除外,显示为:
dd/mm/yyy
如何获取已输入的日期以显示“models.py
class Project(models.Model):
'''
Main Project, serves the default Projects Portal window.
'''
published = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
area = models.ForeignKey(
Area,
related_name="project",
on_delete=models.PROTECT
)
title = models.CharField(max_length=128, unique=True)
slug = models.SlugField(max_length=64)
summary = models.CharField(max_length=256)
others = models.CharField(max_length=128, blank=True)
staff_trials = models.DateField(null=True, blank=True)
deadline = models.DateField()
slip = models.BooleanField(default=False)
class Meta:
ordering = ["-slip", "deadline"]
def __str__(self):
return self.title
表格.py
class DateInput(forms.DateInput):
input_type = 'date'
class ProjectModelForm(forms.ModelForm):
"""
Form used for creating and editing projects. Authenticated User
required to be signed in.
"""
title = forms.CharField(widget=forms.Textarea)
summary = forms.CharField(widget=forms.Textarea)
class Meta:
model = Project
fields = (
'title',
'summary',
'others',
'staff_trials',
'deadline',
'area',
)
widgets = {
'staff_trials': DateInput(),
'deadline': DateInput(),
}
视图.py
class ProjectEditView(UpdateView):
template_name = 'project_portal/project_detail.html'
form_class = ProjectModelForm
queryset = Project.objects.all()
def form_valid(self, form):
user = self.request.user
form.instance.user = user
print(form.cleaned_data)
return super().form_valid(form)
def get_object(self):
slug_ = self.kwargs.get("slug")
return get_object_or_404(Project, slug=slug_)
解决方案
你不应该再次定义title
and summary
。如果您想要一个文本区域小部件,只需在Meta
表单的一部分中指定它,它会更干净。我认为forms.DateInput
在您的情况下覆盖默认值没有用。
class ProjectModelForm(forms.ModelForm):
class Meta:
model = Project
fields = (
'title',
'summary',
'others',
'staff_trials',
'deadline',
'area',
)
widgets = {
'title': forms.Textarea(),
'summary': forms.Textarea(),
'staff_trials': forms.DateInput(),
'deadline': forms.DateInput(),
}
最后,您确定好对象正在用于您的更新视图吗?字段title
等summary
是预期的吗?
编辑:另一种解决方案,带有django-tempus-dominus
包,非常有用并且带有漂亮的小部件。
安装小部件
pip install django-tempus-dominus
然后,将应用程序添加tempus_dominus
到您的INSTALLED_APPS
设置中。
在表单中使用小部件
# forms.py
from tempus_dominus.widgets import DatePicker
class ProjectModelForm(forms.ModelForm):
class Meta:
model = Project
fields = [
'title',
'summary',
'others',
'staff_trials',
'deadline',
'area',
]
widgets = {
'deadline': DatePicker(
options={
'format': 'DD/MM/YYYY'
},
attrs={
'prepend': 'fa fa-calendar',
},
)
}
DatePicker
您可以为您的小部件添加很多选项,例如查看此处和此处。
更新您的模板
只需添加{{ form.media }}
用于显示您的日期的模板。要显示日期,您无需更改任何内容:{{ form.deadline }}
。
注意:如果需要,不要忘记添加缺少的资源!像 jQuery、Bootstrap4 一样...只需查看<head></head>
文档中指定的资源即可。
实际例子(我自己的配置)
例如,这是我这样做的方法,任何日期都只能通过点击来设置(用户不能在日期输入中键入):
# forms.py
import datetime
from allauth.account.forms import SignupForm
from django import forms
from django.utils.translation import ugettext_lazy as _
from tempus_dominus.widgets import DatePicker
sixteen_years_ago = datetime.date.today() - datetime.timedelta(days=16*365.24)
common_options_for_datetimepicker = {
'icons': {
'time': 'far fa-clock',
'date': 'far calendar-alt',
'up': 'fas fa-arrow-circle-up',
'down': 'fas fa-arrow-circle-down',
'previous': 'far fa-arrow-alt-circle-left fa-lg',
'next': 'far fa-arrow-alt-circle-right fa-lg',
},
'widgetPositioning': {
'vertical': 'bottom',
'horizontal': 'left'
},
'ignoreReadonly': True,
}
class Signup_MixinForm(SignupForm):
class Meta:
abstract = True
class SignupRegular_Form(Signup_MixinForm):
birth_date = forms.DateField(
required=True,
initial=sixteen_years_ago,
widget=DatePicker(
options={
**common_options_for_datetimepicker,
'format': 'D/MM/YYYY',
'maxDate': sixteen_years_ago.strftime('%Y-%m-%d')
},
attrs={
'prepend': 'fa fa-calendar',
'size': 'large',
'placeholder': _("Your birth date"),
'readonly': 'readonly'
},
),
)
推荐阅读
- javascript - 只执行“if”5 秒,然后继续执行“else”
- html - 纯 CSS 中非全宽 div 的视差滚动
- php - 过滤具有相同值的数组键
- java - Java combining two hashmaps of the same type into a new hashmap keeping duplicates
- python - 用于固定字符长度的 Python 正则表达式
- cordova - 尝试运行离子项目时出错
- rust - 在命令缓冲区执行之间清除非瞬态图像
- java - Spark 独立模式:有没有办法以编程方式从 Spark 的 localhost:8080 获取每个工作人员的核心/内存信息
- powershell - 记录 Powershell 模块:您应该对输出类型有多具体?
- c# - 如何强制实体框架允许数据库创建 GUID PK?