Django 1.8 和 Django Crispy Forms:是不是有一种简单易行的方法来实现日期选择器?

Posted

技术标签:

【中文标题】Django 1.8 和 Django Crispy Forms:是不是有一种简单易行的方法来实现日期选择器?【英文标题】:Django 1.8 & Django Crispy Forms: Is there a simple, easy way of implementing a Date Picker?Django 1.8 和 Django Crispy Forms:是否有一种简单易行的方法来实现日期选择器? 【发布时间】:2015-10-11 10:58:30 【问题描述】:

那里有大量的日期/日期时间选择器实现。有没有与 Django 和 Crispy Forms 集成得特别好的,它们是如何使用的?

我希望最大限度地减少开发工作,最大限度地简化并利用 Django 本地化。

日期字段的 Django/Crispy 标准输出:

<input class="dateinput form-control" id="id_birth_date" name="birth_date" type="text" value="21/07/2015">

在模型中:

birth_date = models.DateField(verbose_name='D.O.B', auto_now_add=False, auto_now=False)

谢谢!

编辑:

个人资料模型:

from django.db import models

class Profile(models.Model):
    birth_date = models.DateField(verbose_name='D.O.B', auto_now_add=False, auto_now=False)

个人资料表格:

from django import forms
from profiles.models import Profile


class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        birth_date = forms.DateField(
            widget=forms.TextInput(
                attrs='type': 'date'
            )
        )

个人资料视图:

from django.shortcuts import get_object_or_404
from django.contrib.auth import get_user_model
from profiles.models import Profile
from profiles.forms import ProfileForm

User = get_user_model()

def edit(request):
    profile = get_object_or_404(Profile, user=request.user)
    form = ProfileForm(request.POST or None, request.FILES or None, instance=profile)
    if request.method == 'POST' and form.is_valid():
        form.save()
    context = 
        'form': form,
        'page_title': 'Edit Profile',
    
    return render(request, 'profiles/edit.html', context)

个人资料编辑模板:

<form enctype="multipart/form-data" method="POST" action=".">
    % csrf_token %
     form 
    <input class='btn btn-primary' type="submit" value="Submit" />
</form>

【问题讨论】:

【参考方案1】:

不是脆表单的答案,但只要输入具有typedate 的属性,较新的浏览器就会为您提供日期选择器。这属于最小开发工作量。

date_field = forms.DateField(
    widget=forms.TextInput(     
        attrs='type': 'date' 
    )
)                                           

【讨论】:

谢谢奥斯汀。这会去哪里?有没有办法为项目中的每次使用覆盖 date_field? 您可以将其放在表单类中作为其字段之一。就像在这里使用your_name 一样:docs.djangoproject.com/en/1.8/topics/forms/… 不。您可以使用 date_field 创建一个表单类,然后将其子类化为所有其他表单。这会将 date_field 传递到创建的每个后续表单。 我无法让它工作。我从模板中删除了|crispy。这还需要什么吗?我在问题中添加了更多细节 从您的 Meta 类中删除birth_date。缩进过度了。【参考方案2】:

django.forms.SelectDateWidget 简单灵活:

date_field = forms.DateField(
    widget=forms.SelectDateWidget(years, months, empty_label)
)

它甚至包括自己的模板文件。

【讨论】:

【参考方案3】:

简单的方法是覆盖字段模板:D

Field('field_name', template='date.html')

Here@maraujop 的要点

【讨论】:

感谢 madzohan,但这比我目前正在寻找的要复杂一些。【参考方案4】:

我的解决方案很简单,使用来自https://eonasdan.github.io/bootstrap-datetimepicker/ 的日期时间选择器。

包含css文件:

<link href="% static 'css/bootstrap-datetimepicker.min.css' %" rel="stylesheet">

包含js文件:

<script src="% static 'js/jquery-3.1.1.js' %"></script>
<script src="% static 'js/bootstrap.min.js' %"></script>
<script src="% static 'js/moment-master/min/moment.min.js' %"></script>
<script src="% static 'js/bootstrap-datetimepicker.min.js' %"></script>

为表单中的字段定义一个 css 类(也适用于 Crispy):

class MyForm(forms.ModelForm):
    class Meta:
        model = MyModelo
        fields =       ['a','b','c']

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['a'].widget.attrs['class'] = 'datepicker'

在模板中包含一个链接到 css 类的 JQuery 函数:

<script type="text/javascript">
$(function () 
    $('.datepicker').datetimepicker(
    
        format: 'YYYY-MM-DD HH:mm:ss',
        sideBySide: true
    
    );
);
</script>

此解决方案适用于 Django 1.10、Crispy Forms 和 Django Model Forms。

【讨论】:

将 bootstrap-datetimepicker 添加到 django 的更简单方法是使用 django-bootstrap-datepicker。我已经尝试过了,它似乎工作正常。【参考方案5】:

只需使用 forms.py 中的小部件功能,如下例所示。

class projectForm(forms.ModelForm):
class Meta:
    model = project
    fields = '__all__'
    widgets = 
        'project_text': Textarea(attrs='cols': 60, 'rows': 10),
        'report_date': forms.TextInput(attrs='type': 'date'),
        'start_date': forms.TextInput(attrs='type': 'date'),
        'end_date': forms.TextInput(attrs='type': 'date')

    

【讨论】:

以上是关于Django 1.8 和 Django Crispy Forms:是不是有一种简单易行的方法来实现日期选择器?的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.8 和鼻子:冲突的模型?

Django 1.8 - migrate 和 makemigrations 有啥区别?

Django 1.8 数组字段追加和扩展

Django 1.8 UpdateView 生成 405 错误和空白模板

Django 1.8_视图和URL配置

将旧 (Django 0.97) 模型数据导入/迁移到 Django 1.8 或更高版本