Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from django.core.exceptions import ValidationError
  2. from django.core.validators import URLValidator
  3. from django.core.urlresolvers import resolve
  4. from django.db import models
  5. from django.http import Http404
  6. class ExtendedURLField(models.CharField):
  7. u"""
  8. Custom field similar to URLField type field, however also accepting
  9. and validating local relative URLs, ie. '/product/'
  10. """
  11. description = "Extended URL"
  12. def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
  13. kwargs['max_length'] = kwargs.get('max_length', 200)
  14. models.CharField.__init__(self, verbose_name, name, **kwargs)
  15. self.is_local_url = False
  16. self.verify_exists = verify_exists
  17. def get_prep_value(self, value):
  18. u"""
  19. Make sure local URLs have preceding and trailing slashes
  20. """
  21. if self.is_local_url == True:
  22. value = self.fix_local_url(value)
  23. return value
  24. def validate(self, value, model_instance):
  25. u"""
  26. Overrides global vaidate method to check whether URL is valid
  27. """
  28. v = URLValidator(verify_exists=self.verify_exists)
  29. try:
  30. v(value)
  31. except ValidationError, e:
  32. if (e.code == 'invalid_link'):
  33. raise ValidationError('This link appears to be broken')
  34. self.validate_local_url(value)
  35. def validate_local_url(self, value):
  36. u"""
  37. Validate local URL name
  38. """
  39. try:
  40. value = self.fix_local_url(value)
  41. if self.verify_exists:
  42. resolve(value)
  43. self.is_local_url = True
  44. except Http404:
  45. raise ValidationError('Specified page does not exist')
  46. def fix_local_url(self, value):
  47. u"""
  48. Puts preceding and trailing slashes to local URL name
  49. """
  50. if value != '/':
  51. value = '/' + value.strip('/') + '/'
  52. return value