Растущая сложность этого ответа со временем и много требуемых взломов, вероятно, должны предостеречь Вас против выполнения этого вообще. Это полагается на недокументированные внутренние детали реализации администратора, вероятно, повредится снова в будущих версиях Django и не легче реализовать, чем просто нахождение другого календарного виджета JS и использование это.
Однако вот то, что необходимо сделать, если Вы полны решимости сделать эту работу:
Определяют Ваш собственный подкласс ModelForm для Вашей модели (лучше всего для помещения его в forms.py в приложении) и говорят, это для использования AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (замените 'mydate' и т.д. надлежащими именами полей из модели):
from django import forms
from my_app.models import Product
from django.contrib.admin import widgets
class ProductForm(forms.ModelForm):
class Meta:
model = Product
def __init__(self, *args, **kwargs):
super(ProductForm, self).__init__(*args, **kwargs)
self.fields['mydate'].widget = widgets.AdminDateWidget()
self.fields['mytime'].widget = widgets.AdminTimeWidget()
self.fields['mydatetime'].widget = widgets.AdminSplitDateTime()
Изменение Ваш URLconf для передачи 'form_class': ProductForm вместо 'модели': продукт к универсальному представлению create_object (это будет означать "от my_app.forms, импортирует ProductForm" вместо "из продукта импорта my_app.models", конечно).
В главе Вашего шаблона, включайте {{form.media}} для вывода ссылок на файлы JavaScript.
И hacky часть: администраторские виджеты даты/времени предполагают, что материал i18n JS был загружен, и также требует core.js, но не обеспечивает ни один автоматически. Таким образом в Вашем шаблоне выше {{form.media}} Вам будет нужно:
можно также хотеть использовать следующий администраторский CSS (спасибо Alex для упоминания этого):
Это подразумевает, что администраторские медиа Django (ADMIN_MEDIA_PREFIX) в/media/admin/-можно изменить это для установки. Идеально Вы использовали бы процессор контекста для передачи, это оценивает шаблону вместо жесткого кодирования его, но это выходит за рамки этого вопроса.
Это также требует, чтобы URL/my_admin/jsi18n/был вручную соединен проводом до представления django.views.i18n.javascript_catalog (или null_javascript_catalog, если Вы не используете I18N). Необходимо сделать это сами вместо того, чтобы пройти приложение администрирования, таким образом, это доступно независимо от того, зарегистрированы ли Вы в администратора (спасибо Jeremy для указания на это). Пример кода для Вашего URLconf:
(r'^my_admin/jsi18n', 'django.views.i18n.javascript_catalog'),
Наконец при использовании Django 1.2 или позже Вам нужен некоторый дополнительный код в Вашем шаблоне, чтобы помочь виджетам найти свои медиа:
{% load adminmedia %} /* At the top of the template. */
/* In the head section of the template. */
Спасибо lupefiasco для этого дополнения.
Если воскресенье - первый день недели, вы можете просто сделать это:
Dim today As Date = Date.Today
Dim dayDiff As Integer = today.DayOfWeek - DayOfWeek.Monday
Dim monday As Date = today.AddDays(-dayDiff)
Если понедельник - первый день недели:
Dim today As Date = Date.Today
Dim dayIndex As Integer = today.DayOfWeek
If dayIndex < DayOfWeek.Monday Then
dayIndex += 7 'Monday is first day of week, no day of week should have a smaller index
End If
Dim dayDiff As Integer = dayIndex - DayOfWeek.Monday
Dim monday As Date = today.AddDays(-dayDiff)
DateTime.DayOfWeek - это перечисление, которое указывает, в какой день заданная дата. Поскольку понедельник равен 1, вы можете найти понедельник текущей недели, используя следующий код:
Dim monday As DateTime = Today.AddDays((Today.DayOfWeek - DayOfWeek.Monday) * -1)
=Format(DateAdd("d", (-1 * WeekDay(Date.Today()) + 2), Date.Today()), "dd/MM/yyyy")
Существует метод дня недели, который вы можете использовать
Dim instance As DateTime
Dim value As DayOfWeek
value = instance.DayOfWeek
см .: http://msdn.microsoft.com/en-us/library/system.datetime.dayofweek .aspx
Простой метод должен дать вам то, что вы хотите:
private static DateTime GetMondayForWeek(DateTime inputDate)
{
int daysFromMonday = inputDate.DayOfWeek - DayOfWeek.Monday;
return inputDate.AddDays(-daysFromMonday);
}
Вы также можете продлить его на любой день, который хотите:
private static DateTime GetDayForWeek(DateTime inputDate, DayOfWeek inputDay)
{
int daysAway = inputDate.DayOfWeek - inputDay;
return inputDate.AddDays(-daysAway);
}
Чтобы вызвать первый пример, просто используйте что-то вроде:
DateTime mondayDate = GetMondayForWeek(new DateTime(2009, 11, 15));
Console.WriteLine(mondayDate);
Я только что сделал это в проекте, над которым работаю - обещаю, это правильно. Это метод, который возвращает n-й понедельник после указанной даты. Если заданная дата - понедельник, возвращается следующий понедельник.
Public Function GetSubsequentMonday(ByVal startDate As DateTime, ByVal subsequentWeeks As Integer) As DateTime
Dim dayOfWeek As Integer = CInt(startDate.DayOfWeek)
Dim daysUntilMonday As Integer = (Math.Sign(dayOfWeek) * (7 - dayOfWeek)) + 1
'number of days until the next Monday
Return startDate.AddDays(CDbl((daysUntilMonday + (7 * (subsequentWeeks - 1)))))
End Function