I am trying to use Django to upload images to a directory on disk. For some reason I'm can't get this to work properly. I get redirected to the submit-success.html page with no errors, however the file doesn't get uploaded. I've provided some code below. Any help would be greatly appreciated. Thanks in advance.
NB:
I'm working on the development server,
I'm using django 1.3,
I'm using sqlite3
This is my form in upload.html
<form enctype="multipart/form-data" action="{% url upload_success %}" method="post">
{% csrf_token %}
<table>{{ form }} </table>
<input type="submit" value="Submit image">
</form>
Here is a link to some code I have written:
https://gist.github.com/1468190
Your handle_uploaded_image method seems faulty. For example, with these lines:
photo_dir = '%s/uploaded_photos/Not_Published/%Y/%m/%d' % settings.MEDIA_ROOT
photo_destination = open(photo_dir, 'wb+')
You're attempting to open a file in "YYYY/MM" with the name of "DD". If you already have "DD" as a directory, this will not work, and if you don't your image is going to be saved as "DD" not as "image.jpg" or whatever. So your image may very well be getting saved, but you're not recognizing it.
Related
That is in templates, I have the following code. the file input has a multiple attribute in the end so that I can select multiple images.
<form method='POST' action="{% url 'method' %}" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="img" multiple />
<input type="submit" />
</form>
<br />
Then I am having trouble to save the image to my model. I tried to print request.FILES, and I got this
<MultiValueDict: {'img': [<InMemoryUploadedFile: 1.jpg (image/jpeg)>,
<InMemoryUploadedFile: 2.jpg (image/jpeg)>, <InMemoryUploadedFile: 3.jpg
(image/jpeg)>]}>
There are 3 items in 'img', I also used request.FILES.getlist('img'), doesn't really work out. How am I suppose to access the content in the 'img' like accessing several individual request.FILES. Thanks!!!
Well, I cannot believe I solved the problem 10mins after I posted it. The key is still
request.FILES.getlist('img'), but make sure you don't use chunks() later, so if you want save the image, save it directly like
for image in request.FILES.getlist('img'):
xxxx.image = image
xxx.save()
That's it. don't use any chunks() methods.
I am trying to upload multiple files using Django. Using following code select multiple files in html form.
index.html
IMAGE Files:<input type="file" name="image" multiple /><br/>
Views.py
image=request.FILES.get('image')
models.py
image=models.ImageField(upload_to=get_upload_pathimage)
Now I get only last file (if I select 3 files then get 3rd file). How to get all images ?
My solution for getting multiple files from html and upload that files in django
index.html
<div id="fine-uploader-manual-trigger">
<input class="custom-file" type="file" name="imgname" id="productImgUpload" accept=".xlsx,.xls,image/*,.doc,audio/*,.docx,video/*,.ppt,.pptx,.txt,.pdf" multiple>
</div>
views.py
filelist = request.FILES.getlist('imgname')
for i in range(len(filepath)):
filename = filelist[i]
request.FILES is a MultiValueDict and doing get will return only the last value as you noted. If you want all of the values you should use images = request.FILES.getlist('image').
i just try for getting multiple images from static folder to html page using for loop in Django.
{% for i in lst %}
<td style="margin-left: 10px;">
<img src="{% static '/images2/' %}{{i}}.png" style="width: 300px; height: 200px;">
{% endfor %}
How to disable the intermediate signout page from django allauth. When the user clicks on the signout link on my site I want him to logout right away, I want to remove this intermediate page
Set ACCOUNT_LOGOUT_ON_GET to True in your settings.
Also see the documentation
Using a GET request is probably a bad idea due to browsers prefetching urls from the URL bar. Chrome (as of right now) is pretty bad for this; it'll send a GET request to pages it think you'll hit enter on when typing in your URL bar.
Plus, people can add a link such as <img src="https://example.com/account/logout/"> and you'll be logged out. That's not a security risk since it's logging you out, but it is certainly annoying for your users.
Instead, you should consider using a POST request using a form with CSRF. Django Allauth already comes with this. Here's the <form> from the intermediate signout page:
<form method="post" action="{% url 'account_logout' %}">
{% csrf_token %}
{% if redirect_field_value %}
<input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/>
{% endif %}
<button class="STYLE_ME" type="submit">Logout</button>
</form>
In my case, I just added this to the site header and made the submit <button> look like every other link using CSS so it feels the same to them, but the form will use a POST request.
But if that's not a solution you can implement for any reason, open your settings.py file (or your main settings file) and set:
ACCOUNT_LOGOUT_ON_GET = True
^ The above setting will do what you need. For further Django Allauth settings, check out their configuration page.
Here's another shortcut for preserving the POST request, if you don't want to mess with styling the form button with something like this:
Hide the form:
<form style='display: none;' method="post" action="{% url 'account_logout' %}">
{% csrf_token %}
<input type="hidden" name="next" value="/redirect_target/"/>
<button id="signOutBtn" type="submit">Logout</button>
</form>
Submit with a click event attached to whatever element you've already styled:
$(document).on('click', '#signOutLink', function() {
$('#signOutBtn').click()
});
I have this recurring problem with form submission in Django, and the frustrating part is that I'm not sure how to interpret what's happening. Essentially I have different pages with form submissions on them. Some of them work as following
localhost/page/formpage--> localhost/page/receivingpage
which is what I expect. Othertimes, it goes to a page like this
localhost/page/formpage--> localhost/page/formpage/recevingpage
and the screen shows a blank form page, which is not what I expect. I'm not sure how to interpret this, and I'm not sure where to look for errors in my code. I think I don't fully understand what's going on when I submit a form, how does it generate a URL after I press 'submit'?
Edit: here is my html form:
<!DOCTYPE HTML>
<html>
<div>
<p>Entry Form</p>
<form action= "user" method="post" >
{% csrf_token %}
<p><label for="id_username">Username:</label>
<input id="id_username" type="text" name="username"" /></p>
<p><label for="id_password">Password</label>
<input type="password" name="password" id="id_password" /></p>
<input type="submit" value="Submit" />
</form>
</div>
</html>
I suspect it isn't the form, I have it on another application and it works... the trouble is I don't know if it's the view, the template, or w/e, so I'll update the post with info as people request it.
I'd recommend putting in an action using the url template tag. With that, you will know for certain where the form is going to end up:
<form action="{% url 'user-url-name' %}" method="post">
The url tag will be an absolute url. Without this, you're going to end up at a relative url depending on where in your application the user submits the form, which can be quite confusing during development and not entirely correct.
Using {% url %} tag is the proper way to do. Your problem can also be solved by adding a forward slash / to the action attribute like this:
<form action="/user" method="post" >
Hope this helps!
I'm just getting started with Django, and I'm trying to use built-in features as much as possible. As such, for user login, I'm using the built-in login view, and assigning it to the base url of my site:
urlpatterns=patterns('django.contrib.auth.views',
url(r'^/$','login',{'template':'mytemplate.html'}),
mytemplate.html looks something like this:
<!DOCTYPE html>
<html>
<body>
{%if form.errors %}
<p> Invalid username/password combination, please try again </p>
{% endif %}
<h1>Welcome to My Site!</h1>
<form action="{% url django.contrib.auth.views.login %}" method="post">
{% csrf_token %}
{{form.username.label_tag}}{{form.username}}
{{form.password.label_tag}}{{form.password}}
<input type="submit" id="submit" name="submit" value="Sign in" />
<input type="hidden" name="next" value="{{ next }}" />
</form>
forgot username/password<br />
new user
</body>
</html>
my problem is, the template doesn't appear to be getting passed any of the context it's supposed to. In the rendered HTML, all of my variable tags simply disappear (i.e. rather than being replaced by the appropriate values, thay are replaced with nothing).
I imagine I'm skipping some critical step, but I can't figure out what it is. Any ideas?
You need to change from 'template' to 'template_name'
urlpatterns=patterns('django.contrib.auth.views',
url(r'^/$','login',{'template_name':'mytemplate.html'}),
https://docs.djangoproject.com/en/1.4/topics/auth/#django.contrib.auth.views.login
Try removing the template name from your url configuration. Django will then fall back to a standard template, that way you can see if you screwed up the template somehow or if something else is wrong.
My next guess would be to check your settings for the TEMPLATE_CONTEXT_PROCESSORS. If you have defined any of them, be sure to include
"django.contrib.auth.context_processors.auth",
If you haven't defined any, django will use a standard tuple, which allready includes the auth processor.