无法使用MEDIA_ROOT在django中上传图像

时间:2017-02-10 13:17:17

标签: python django python-3.x

我试图上传图片,但我一直在谷歌搜索,但我找不到解决方案。 问题是它没有上传图像,在数据库中保存的数据为空。 任何人帮我找到问题的解决方案。 我使用django 1.10和Linux。

注意:英语不是我的母语;请原谅我的任何错误

请注意,如果我可以从Django admin

中上传图像

settings.py

STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/imagenes/')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)

Models.py

from django.db import models
from apps.almacen.categoria.models import Categoria
# Create your models here.
class Articulo(models.Model):
    idarticulo = models.AutoField(primary_key=True)
    codigo= models.CharField(max_length=50)
    nombre= models.CharField(max_length=100)
    stock= models.IntegerField()
    descripcion=models.CharField(max_length=512)
    imagen=models.FileField(upload_to = 'articulos/',null=True,blank=True)
    estado=models.CharField(max_length=20)
    idcategoria= models.ForeignKey(Categoria,db_column='idcategoria',null=True,blank=True,on_delete=models.CASCADE)

    def __str__(self):
                return '{}'.format(self.nombre)

forms.py

from django import forms
from apps.almacen.articulo.models import Articulo

class ArticuloForm(forms.ModelForm):
    class Meta:
        model = Articulo
        fields = [
            'idarticulo',
            'nombre',
            'codigo',
            'descripcion',
            'idcategoria',
            'stock',
            'imagen',

        ]
        labels = {
            'idarticulo':'Articulo',
            'nombre':'Nombre',
            'codigo':'Codigo',
            'descripcion':'Descripción',
            'idcategoria':'Categoria',
            'stock':'Stock',
            'imagen':'Imagen',

        }
        widgets = {
            'nombre': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Digite el nombre'}),
            'codigo': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Digite el código'}),
            'idcategoria': forms.Select(attrs={'class':'form-control'}),
            'stock': forms.TextInput(attrs={'class':'form-control', 'placeholder':'Digite el stock'}),
            'descripcion': forms.TextInput(attrs={'class':'form-control','placeholder':'Digite la Descripción'}),
            'imagen': forms.FileInput(attrs={'class':'form-control'}),
        }

Views.py

class ArticuloCreate(CreateView):
    model= Articulo
    form_class= ArticuloForm
    template_name='almacen/articulo/articulo_form.html'
    success_url= reverse_lazy('almacen_art:articulo_listar')

    def post(self, request, *args, **kwargs):
        self.object = self.get_object
        form = self.form_class(request.POST)
        if form.is_valid():
            articulos = form.save(commit=False)
            articulos.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.render_to_response(self.get_context_data(form=form))

articulo.html

<form method="post" enctype='multipart/form-data'>
            {% csrf_token %}
<div class="row">
        <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
                                <div class="form-group">
                                    <label for="image">Imagen</label>
                                    {{form.imagen}}
                                </div>
                            </div>
                            <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
                                <div class="form-group">
                                    <button class="btn btn-primary" type="submit">Guardar</button>
                                    <button class="btn btn-danger" type="reset">Cancelar</button>
                                </div>
                            </div>
                 </div>

    </form>

{% endblock %}
你可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

您正在覆盖post方法上的表单,但是您没有将文件绑定到新表单,文档明确说明您需要这样做:
Binding uploaded files to a form

  

其次,当您使用表单时,您需要绑定文件数据。文件数据分别处理为普通表单数据,因此当您的表单时   包含FileField和ImageField,您需要指定一秒   绑定表单时的参数。

所以你的行

form = self.form_class(request.POST)

应该成为

form = self.form_class(request.POST, request.FILES)

此外,我认为您的整个post方法是不必要的,您只需复制CreateView的默认行为。
另外一件事,让你的媒体文件位于静态文件目录中会使你的collectstatic命令在你每次更改静态文件时都运行所有上传的文件,你会等待更长的等待时间在该命令和重复上传。

希望这有帮助。