3

如何DateTimeField在 django admin 中预填充来自 URL?

假设您的模型是:

class MyModel(models.Model):
    name = models.CharField(max_length=14)
    date = models.DateTimeField()

然后,您可以通过将值作为 GET 参数传递给添加视图,使模型“添加”表单预填充值,例如:

/admin/app/mymodel/add/?name=Test

这是一个非常酷的功能,但是您如何为 DateTimeField 实现此功能?

我尝试了许多可能的格式但没有成功。

更新:

这似乎是不可能的,因为 django admin 使用了SplitDateTimeWidgetfor DateTimeField。但是,如果您不介意使用不同的小部件并丢失日期选择器,则可以改用DateTimeInput小部件。

最快的方法是将其添加到您的ModelAdmin课程中:

formfield_overrides = {
    models.DateTimeField: {'widget': DateTimeInput},
}
4

2 回答 2

5

首先定义序列化/反序列化格式:

DATETIME_FORMAT="%Y-%m-%d %H:%M:%S"  

然后,当您要打开管理 url 时使用它:

copiedArguments = {
   "fromDateTime": event.fromDateTime.strftime(DATETIME_FORMAT)
}
return HttpResponseRedirect(
            u"{}?{}".format(reverse('admin:events_event_add'), urllib.urlencode(copiedArguments)))

最后但并非最不重要的一点是在模型管理员中提取日期时间:

def get_changeform_initial_data(self, request):
    initialData = super(EventAdmin, self).get_changeform_initial_data(request)
    initialData["fromDateTime"] = datetime.datetime.strptime(request.GET["fromDateTime"],DATETIME_FORMAT)
    return initialData
于 2016-10-01T10:38:25.643 回答
3

问题似乎与小部件有关。ADateField可以正常工作?date=yyyy-mm-dd,但 aDateTimeField使用SplitDateTimeWidget. 它不能有一个字符串作为初始值。

也许您可以提出一个补丁来SplitDateTimeWidget尝试转换字符串值,或者您可以更改 a 的管理员默认小部件DateTimeField(如果可能的话)。

于 2012-09-28T19:04:16.627 回答