0

every one ,,I can upload image from admin site,, but do not know how to upload image from the templates,,

models.py

from django.db import models
from django.contrib.auth.models import User
from PIL import Image
from django.utils import timezone



def get_imagep_Product(instance, filename):
    return '/'.join(['products', instance.slug, filename])


class ProductsTbl(models.Model):
    model_number = models.CharField(max_length=255, blank=True, null=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    material = models.TextField(blank=True, null=True)
    feature = models.TextField(blank=True, null=True)
    created = models.DateTimeField(editable=False)
    modified = models.DateTimeField(auto_now=True)
    release = models.DateTimeField(blank=True, null=True)
    submit_date = models.DateTimeField(blank=True, null=True)
    slug = models.SlugField(unique=True)
    user = models.ForeignKey(User, blank=True, null=True)
    image = models.ImageField(upload_to=get_imagep_Product, blank=True) #image file 

    def __unicode__(self):
        return self.name
    def save(self, *args, **kwargs):
        ''' On save, update timestamps '''

        if not self.id:
            self.created = timezone.now()
        return super(ProductsTbl, self).save(*args, **kwargs)

views.py

from django.shortcuts import render,redirect
from .forms import ProductsTblForm
from .models import ProductsTbl
from django.template.defaultfilters import slugify
from django.contrib.auth.decorators import login_required
from django.http import Http404,HttpResponse
import datetime

def create_thing(request):
    form_class = ProductsTblForm

    if request.method == 'POST':

        form = form_class(request.POST)
        if form.is_valid():

            thing = form.save(commit=False)

            thing.user = request.user
            thing.slug = slugify(thing.model_number)

            thing.save()

            return redirect('thing_detail', slug=thing.slug)

    else:
        form = form_class()
    return render(request, 'things/create_thing.html', { 'form': form,})

urls.py

from django.conf.urls import patterns, url,include
from django.contrib import admin
from django.views.generic import TemplateView
from designer import views
from designer.backends import MyRegistrationView
from django.conf import settings

urlpatterns = [
    url(r'^create_thing/$', views.create_thing, name='create_thing'),
]

if settings.DEBUG:
    urlpatterns += [
        url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
            'document_root': settings.MEDIA_ROOT,
        }),
    ]

forms.py

from django.forms import ModelForm
from .models import ProductsTbl


class ProductsTblForm(ModelForm):
    class Meta:
        model = ProductsTbl
        fields = ('model_number','name','feature', 'material','release','image',)

create_thing.html

{% extends 'base.html' %} {% block title %}
Create a Thing - {{ block.super }} {% endblock title %}
{% block content %}
<h1>Create a Thing</h1>
<form role="form" action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
{% endblock content %}

when I click the create things I can see form here,,however I do not know how can let the image upload

enter image description here

I have looking for this link ,,however I do not know how to let it work in my app,,

Community
  • 1
  • 1
Joe Lin
  • 613
  • 2
  • 11
  • 33
  • 1
    Creating you form by `form_class(request.POST, request.FILES)` instead of `form_class(request.POST)` should be enough. – Muhammad Tahir Apr 27 '16 at 10:41
  • I add request.FILES like ,,form = form_class(request.POST,request.FILES),,,but when I submit upload ,,there is no image in midea/ ,,,?? – Joe Lin Apr 27 '16 at 11:07

1 Answers1

1

First, you will need to add enctype="multipart/form-data" in your <form> definition. As this is required for file uploads.

<form role="form" action="" method="post" enctype="multipart/form-data">

Second, instead of form_class(request.POST) you will need to create form in your view by passing request.FILES too.

form_class(request.POST, request.FILES)
Muhammad Tahir
  • 5,006
  • 1
  • 19
  • 36