在Django管理后台中,从URL填充DateTimeField

4
如何在Django管理界面中从URL预填一个DateTimeField?
假设您的模型如下:
class MyModel(models.Model):
    name = models.CharField(max_length=14)
    date = models.DateTimeField()

接下来,您可以通过将它们作为GET参数传递到添加视图中来预填充模型的“添加”表单中的值,如下所示:

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

这是一个非常酷的功能,但是如何在DateTimeField中实现呢?

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

更新:

似乎无法做到,因为django admin在DateTimeField上使用了SplitDateTimeWidget。但是,如果你不介意使用不同的widget并且不需要日期选择器,可以改用DateTimeInput widget。

最快的方法是将以下代码添加到您的ModelAdmin类中:

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

我发现这个四年前的 ticket 很有用。 - bformet
3个回答

6

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

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

当您想要打开管理员网址时,请使用它:

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

3
问题似乎出在小部件上。 DateField 可以很好地使用 ?date=yyyy-mm-dd,但是 DateTimeField 使用 SplitDateTimeWidget 。它无法将字符串作为初始值。
也许您可以提出一个补丁来尝试转换字符串值,或者您可以更改 DateTimeField 的默认小部件(如果可能)。

是的,我可以使用一个简单的TextInput小部件。我仍在努力弄清楚如何做到这一点。 - bformet

1

现在有一个名为get_changeform_initial_data的ModelAdmin方法。

我是这样传递查询参数的: ?start=2022年8月9日 12:30&end=2022年8月9日 17:00

通过像这样覆盖该方法,它可以正常工作:

    def get_changeform_initial_data(self, request):
        initial = super().get_changeform_initial_data(request)
        if "end" in initial:
            initial["end"] = datetime.datetime.strptime(initial["end"], "%d/%m/%Y %H:%M")
        if "start" in initial:
            initial["start"] = datetime.datetime.strptime(initial["start"], "%d/%m/%Y %H:%M")
        return initial

这也在这个问题的评论中提到,对于那些在Django管理界面中尝试从查询参数预填日期时间字段时遇到'str' object has no attribute 'utcoffset'错误的人很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接