I want to check in django if a URL exists and if it does I want to show something on screen, i.e.:
if URL_THAT_POINTS_TO_SOME_PDF exists
SHOW_SOMETHING
I want to check in django if a URL exists and if it does I want to show something on screen, i.e.:
if URL_THAT_POINTS_TO_SOME_PDF exists
SHOW_SOMETHING
validate(value)
fails if the url is not preceeded with a schema likehttp://
. I wonder if that is by design.Problem
from django.core.validators import URLValidator
says thatwww.google.ro
is invalid. Which is wrong in my point of view. Or at least not enough.How to solve it?
The clue Is to look at the source code for
models.URLField
, you will see that it usesforms.FormField
as a validator. Which does more thanURLValidator
from aboveSolution
If I want to validate a
url
likehttp://www.google.com
or likewww.google.ro
, I would do the following:from django.forms import URLField
I found this useful. Maybe it helps someone else.
It took an additional:
from django.core.exceptions import ValidationError
for it to work for me. Just saying ;0)
I have not seen the answer here. It might helpful to someone else.
Edit: Please note, this is no longer valid for any version of Django above 1.5
I assume you want to check if the file actually exists, not if there is just an object (which is just a simple if statement)
First, I will recommend always looking through Django's source code because you will find some great code that you could use :)
I assume you want to do this within a template. There is no built-in template tag to validate a URL but you could essentially use that
URLValidator
class within a template tag to test it. Simply:The
URLValidator
class will spit out theValidationError
when it can't open the link. It usesurllib2
to actually open the request so it's not just using basic regex checking (But it also does that.)You can plop this into a custom template tag, which you will find out how to create in the django docs and off you go.
Hope that is a start for you.
See: http://www.agmweb.ca/2009-04-19-django-urlpatterns---its-more-than-just-urls/
In django 1.10 i now use: