Подкласс AdminTimeWidget
, чтобы включить измененный DateTimeShortcuts.js (получить к нему в секунду), затем подкласс AdminSplitDateTime
включить ваш подклассы MyAdminTimeWidget
вместо стандартного Django:
from django.contrib.admin.widgets import AdminTimeWidget
from django.conf import settings
class MyAdminTimeWidget(AdminTimeWidget):
class Media:
js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
settings.MEDIA_URL + "js/admin/DateTimeShortcuts.js")
class MyAdminSplitDateTime(AdminSplitDateTime):
def __init__(self, attrs=None):
widgets = [AdminDateWidget, MyAdminTimeWidget]
forms.MultiWidget.__init__(self, widgets, attrs)
Секретный соус находится в django/contrib/admin/media/js/admin/DateTimeShortcuts.js
. Это то, что создает список, который вы хотите изменить. Скопируйте этот файл и вставьте его в каталог site_media/js/admin
вашего проекта. Соответствующий код, который вам нужно изменить, находится в строках 85-88:
quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().strftime('" + time_format + "'));");
quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,0,0,0,0).strftime('" + time_format + "'));");
quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,6,0,0,0).strftime('" + time_format + "'));");
quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,12,0,0,0).strftime('" + time_format + "'));");
Просто добавьте / удалите / измените этот бит javascript на контент вашего сердца.
Наконец, присоедините свой новый виджет к любым типам DateTimeFields, которые вам нравятся. Лучше всего для этого, вероятно, будет атрибут formfield_overrides
на ModelAdmin
:
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.DateTimeField: {'widget': MyAdminSplitDateTime},
}
Эти два руководства помогли, когда я хотел сделать то же самое и хорошо работать:
http://www.coderjournal.com/2008/03/force-mvc-route-url -lowercase / http://goneale.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/
РЕДАКТИРОВАТЬ: для проектов с областями вам необходимо изменить GetVirtualPath () метод:
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var lowerCaseValues = new RouteValueDictionary();
foreach (var v in values)
{
switch (v.Key.ToUpperInvariant())
{
case "ACTION":
case "AREA":
case "CONTROLLER":
lowerCaseValues.Add(v.Key, ((string)v.Value).ToLowerInvariant());
break;
default:
lowerCaseValues.Add(v.Key.ToLowerInvariant(), v.Value);
break;
}
}
return base.GetVirtualPath(requestContext, lowerCaseValues);
}
Не могли бы вы использовать атрибут ActionName?
[ActionName("more_details")]
public ActionResult MoreDetails(int? page)
{
}
Я не думаю, что регистр имеет значение. More_Details, more_DETAILS, mOrE_DeTaIL в URL-адресе ведут к одному и тому же действию контроллера.
Это действительно имеет два ответа:
Вы сами выбираете подчеркивания ...
Я нашел это в Журнале кодеров Ника Берарди , но там не было информации о том, как реализовать класс LowercaseRoute
. Поэтому репост здесь с дополнительной информацией.
Сначала расширите класс Route
до LowercaseRoute
public class LowercaseRoute : Route
{
public LowercaseRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler) { }
public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(url, defaults, routeHandler) { }
public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler) { }
public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler routeHandler) : base(url, defaults, constraints, dataTokens, routeHandler) { }
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
VirtualPathData path = base.GetVirtualPath(requestContext, values);
if (path != null)
path.VirtualPath = path.VirtualPath.ToLowerInvariant();
return path;
}
}
, затем измените метод RegisterRoutes
файла Global.asax.cs
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add(new LowercaseRoute("{controller}/{action}/{id}",
new RouteValueDictionary(new { controller = "Home", action = "Index", id = "" }),
new MvcRouteHandler()));
//routes.MapRoute(
// "Default", // Route name
// "{controller}/{action}/{id}", // URL with parameters
// new { controller = "Home", action = "Index", id = "" } // Parameter defaults
//);
}
I однако хотелось бы знать способ использования routes.MapRoute ...
Я всегда считал форматировщик кода Vim отличным вариантом. Он поддерживает множество языков и может быть разумно настроен.
Вы можете направить соответствующие команды в vim следующим образом:
vim MyClass.java <<< gg=G:wq
Объяснение:
gg = G
форматирует файл :
Вы можете продолжить использование синтаксиса MapRoute, добавив этот класс в качестве расширения к RouteCollection:
public static class RouteCollectionExtension
{
public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults)
{
return routes.MapRouteLowerCase(name, url, defaults, null);
}
public static Route MapRouteLowerCase(this RouteCollection routes, string name, string url, object defaults, object constraints)
{
Route route = new LowercaseRoute(url, new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(defaults),
Constraints = new RouteValueDictionary(constraints)
};
routes.Add(name, route);
return route;
}
}
Теперь вы можете использовать при запуске вашего приложения «MapRouteLowerCase» вместо «MapRoute»:
public void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// Url shortcuts
routes.MapRouteLowerCase("Home", "", new { controller = "Home", action = "Index" });
routes.MapRouteLowerCase("Login", "login", new { controller = "Account", action = "Login" });
routes.MapRouteLowerCase("Logout", "logout", new { controller = "Account", action = "Logout" });
routes.MapRouteLowerCase(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}