如何使用默认管理员在自定义视图中使用的漂亮的JavaScript日期和时间小部件?
我查看了Django表单文档,并简要提到了django.contrib.admin.widgets,但我不知道如何使用它?
这是我想要应用的模板.
<form action="." method="POST">
<table>
{% for f in form %}
<tr> <td> {{ f.name }}</td> <td>{{ f }}</td> </tr>
{% endfor %}
</table>
<input type="submit" name="submit" value="Add Product">
</form>
Run Code Online (Sandbox Code Playgroud)
此外,我认为应该注意的是,我没有真正为自己的表单编写视图,我使用的是通用视图.这是来自url.py的条目:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
Run Code Online (Sandbox Code Playgroud)
而且我对整个Django/MVC/MTV事物都是新手,所以请轻松一点......
我现在只使用Django几周了,所以我可能会遇到各种各样的错误,但是:
我有一个基本的ModelForm,我把一些样板文件放在尽可能保持DRY的地方,而我所有的实际ModelForms只是将该基本形式子类化.这对我来说很有用error_css_class = 'error',required_css_class = 'required'但是formfield_callback = add_css_classes并没有像我期望的那样工作.
# snippet I found
def add_css_classes(f, **kwargs):
field = f.formfield(**kwargs)
if field and 'class' not in field.widget.attrs:
field.widget.attrs['class'] = '%s' % field.__class__.__name__.lower()
return field
class BaseForm(forms.ModelForm):
formfield_callback = add_css_classes # not working
error_css_class = 'error'
required_css_class = 'required'
class Meta:
pass
class TimeLogForm(BaseForm):
# I want the next line to be in the parent class
# formfield_callback = add_css_classes
class Meta(BaseForm.Meta):
model = TimeLog
Run Code Online (Sandbox Code Playgroud)
最终目标是使用一类datefield/timefield/datetimefield在表单上打一些jquery日期时间选择器.我希望应用程序中的所有日期时间字段都使用相同的小部件,因此我选择这样做,而不是明确地为每个模型中的每个字段执行此操作.为每个表单类添加一个额外的行并不是什么大不了的事,但它只是在告诉我我无法理解它.在django来源中挖掘表明这可能正在做一些我不理解的事情: …
我正试图找到一种简单的方法来构建以澳大利亚格式显示日期的表格(年/月/日).这是我能找到的唯一方法.似乎应该有一个更好的解决方案.
注意事项:
我想,理想的解决方案是一个自动本地化的日期字段,但对我来说不起作用(strftime似乎不是unicode友好但我没有努力尝试)
我错过了什么吗?有更优雅的解决方案吗?这是一种强有力的方法吗?
from models import *
from django import forms
import datetime
class MyDateWidget(forms.TextInput):
def render(self, name, value, attrs=None):
if isinstance(value, datetime.date):
value=value.strftime("%d/%m/%Y")
return super(MyDateWidget, self).render(name, value, attrs)
class MyDateField(forms.DateField):
widget = MyDateWidget
def __init__(self, *args, **kwargs):
super(MyDateField, self).__init__(*args, **kwargs)
self.input_formats = ("%d/%m/%Y",)+(self.input_formats)
class ExampleForm(ModelForm):
class Meta:
model=MyModel
fields=('name', 'date_of_birth')
date_of_birth = MyDateField()
Run Code Online (Sandbox Code Playgroud)