test_datetimeinput.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from datetime import datetime
  2. from django.forms import CharField, DateTimeInput, Form
  3. from django.test import ignore_warnings
  4. from django.utils import translation
  5. from django.utils.deprecation import RemovedInDjango50Warning
  6. from .base import WidgetTest
  7. class DateTimeInputTest(WidgetTest):
  8. widget = DateTimeInput()
  9. def test_render_none(self):
  10. self.check_html(self.widget, "date", None, '<input type="text" name="date">')
  11. def test_render_value(self):
  12. """
  13. The microseconds are trimmed on display, by default.
  14. """
  15. d = datetime(2007, 9, 17, 12, 51, 34, 482548)
  16. self.assertEqual(str(d), "2007-09-17 12:51:34.482548")
  17. self.check_html(
  18. self.widget,
  19. "date",
  20. d,
  21. html=('<input type="text" name="date" value="2007-09-17 12:51:34">'),
  22. )
  23. self.check_html(
  24. self.widget,
  25. "date",
  26. datetime(2007, 9, 17, 12, 51, 34),
  27. html=('<input type="text" name="date" value="2007-09-17 12:51:34">'),
  28. )
  29. self.check_html(
  30. self.widget,
  31. "date",
  32. datetime(2007, 9, 17, 12, 51),
  33. html=('<input type="text" name="date" value="2007-09-17 12:51:00">'),
  34. )
  35. def test_render_formatted(self):
  36. """
  37. Use 'format' to change the way a value is displayed.
  38. """
  39. widget = DateTimeInput(
  40. format="%d/%m/%Y %H:%M",
  41. attrs={"type": "datetime"},
  42. )
  43. d = datetime(2007, 9, 17, 12, 51, 34, 482548)
  44. self.check_html(
  45. widget,
  46. "date",
  47. d,
  48. html='<input type="datetime" name="date" value="17/09/2007 12:51">',
  49. )
  50. @translation.override("de-at")
  51. def test_l10n(self):
  52. d = datetime(2007, 9, 17, 12, 51, 34, 482548)
  53. self.check_html(
  54. self.widget,
  55. "date",
  56. d,
  57. html=('<input type="text" name="date" value="17.09.2007 12:51:34">'),
  58. )
  59. @translation.override("de-at")
  60. def test_locale_aware(self):
  61. d = datetime(2007, 9, 17, 12, 51, 34, 482548)
  62. # RemovedInDjango50Warning: When the deprecation ends, remove
  63. # @ignore_warnings and USE_L10N=False. The assertion should remain
  64. # because format-related settings will take precedence over
  65. # locale-dictated formats.
  66. with ignore_warnings(category=RemovedInDjango50Warning):
  67. with self.settings(USE_L10N=False):
  68. with self.settings(
  69. DATETIME_INPUT_FORMATS=[
  70. "%Y-%m-%d %H:%M:%S",
  71. "%Y-%m-%d %H:%M:%S.%f",
  72. "%Y-%m-%d %H:%M",
  73. ]
  74. ):
  75. self.check_html(
  76. self.widget,
  77. "date",
  78. d,
  79. html=(
  80. '<input type="text" name="date" '
  81. 'value="2007-09-17 12:51:34">'
  82. ),
  83. )
  84. with translation.override("es"):
  85. self.check_html(
  86. self.widget,
  87. "date",
  88. d,
  89. html='<input type="text" name="date" value="17/09/2007 12:51:34">',
  90. )
  91. def test_fieldset(self):
  92. class TestForm(Form):
  93. template_name = "forms_tests/use_fieldset.html"
  94. field = CharField(widget=self.widget)
  95. form = TestForm()
  96. self.assertIs(self.widget.use_fieldset, False)
  97. self.assertHTMLEqual(
  98. '<div><label for="id_field">Field:</label>'
  99. '<input id="id_field" name="field" required type="text"></div>',
  100. form.render(),
  101. )