forms.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from django import forms
  2. from django.conf import settings
  3. from django.contrib.flatpages.models import FlatPage
  4. from django.core.exceptions import ValidationError
  5. from django.utils.translation import gettext
  6. from django.utils.translation import gettext_lazy as _
  7. class FlatpageForm(forms.ModelForm):
  8. url = forms.RegexField(
  9. label=_("URL"),
  10. max_length=100,
  11. regex=r"^[-\w/.~]+$",
  12. help_text=_(
  13. "Example: “/about/contact/”. Make sure to have leading and trailing "
  14. "slashes."
  15. ),
  16. error_messages={
  17. "invalid": _(
  18. "This value must contain only letters, numbers, dots, "
  19. "underscores, dashes, slashes or tildes."
  20. ),
  21. },
  22. )
  23. class Meta:
  24. model = FlatPage
  25. fields = "__all__"
  26. def __init__(self, *args, **kwargs):
  27. super().__init__(*args, **kwargs)
  28. if not self._trailing_slash_required():
  29. self.fields["url"].help_text = _(
  30. "Example: “/about/contact”. Make sure to have a leading slash."
  31. )
  32. def _trailing_slash_required(self):
  33. return (
  34. settings.APPEND_SLASH
  35. and "django.middleware.common.CommonMiddleware" in settings.MIDDLEWARE
  36. )
  37. def clean_url(self):
  38. url = self.cleaned_data["url"]
  39. if not url.startswith("/"):
  40. raise ValidationError(
  41. gettext("URL is missing a leading slash."),
  42. code="missing_leading_slash",
  43. )
  44. if self._trailing_slash_required() and not url.endswith("/"):
  45. raise ValidationError(
  46. gettext("URL is missing a trailing slash."),
  47. code="missing_trailing_slash",
  48. )
  49. return url
  50. def clean(self):
  51. url = self.cleaned_data.get("url")
  52. sites = self.cleaned_data.get("sites")
  53. same_url = FlatPage.objects.filter(url=url)
  54. if self.instance.pk:
  55. same_url = same_url.exclude(pk=self.instance.pk)
  56. if sites and same_url.filter(sites__in=sites).exists():
  57. for site in sites:
  58. if same_url.filter(sites=site).exists():
  59. raise ValidationError(
  60. _("Flatpage with url %(url)s already exists for site %(site)s"),
  61. code="duplicate_url",
  62. params={"url": url, "site": site},
  63. )
  64. return super().clean()