Django - проблемы URLField вокруг абсолютных и относительных URL - PullRequest
1 голос
/ 22 июня 2011

У меня есть URLField, который не является обязательным в моей модели.Я также сделал это необязательным в ModelForm.Проблема в том, что я ТОЛЬКО хочу, чтобы форма генерировала абсолютные URL.Я думал, что URLField автоматически делает это, но в настоящее время он не работает для меня.

Итак, чтобы решить эту проблему, я решил переопределить метод save () в модели.Я хотел переопределить метод clean_field () в поле модели формы;однако кажется, что вы не можете установить метод clean_field для поля формы с помощью «required = False».

   def save(self,*args, **kwargs):
       if self.url:
            if not self.url.startswith('http://'):
               self.url='http://' + self.url
       super(Post, self).save(*args, **kwargs)

Я что-то здесь упускаю?Это вполне приемлемо?

1 Ответ

1 голос
/ 22 июня 2011

Если в вашей модели есть поле с именем url, и вы определяете метод clean_url () в ModelForm, он должен вызываться при наличии URL-адреса независимо от того, является ли оно необязательным полем. Выполняя проверку в методе save, вы смешиваете проблемы и нарушаете дизайн класса ModelForm. Проверка правильности всегда должна считаться завершенной после успешного вызова is_valid ().

Но, кроме этого, у вас есть еще одна проблема.

Помните, URL пишется scheme://host:port/absolute_path. Абсолютный путь закодирован в URL, но сам URL - это больше, чем просто абсолютный путь.

Проблема с относительными путями заключается в определении того, к чему они относятся. Абсолютные пути начинаются с начального символа '/' и всегда относятся к корню сервера или файловой системы. Относительные пути относятся к текущему активному ресурсу. Проблема здесь в том, каков текущий активный ресурс? Кроме того, информирование save () об этой информации (и, следовательно, ее требование) наверняка является нарушенной архитектурой.

Кроме того, ваш код выше будет работать на альтернативных схемах (https), он не вставляет хост в URL, а для путей, не относящихся к корню, как мы узнаем, к чему они относятся?

Я думаю, у вас была правильная стратегия для начала. Разрешить ввод только абсолютных путей и URL, а не относительных путей. Пусть ваша ModelForm заменит абсолютные пути на действительные URL. Для этого еще раз взгляните на документацию для методов clean () в ModelForm, и, если у вас возникнут проблемы с этим, откройте новый вопрос, относящийся к этой проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...