我试图上传图片,但我一直在谷歌搜索,但我找不到解决方案。 问题是它没有上传图像,在数据库中保存的数据为空。 任何人帮我找到问题的解决方案。 我使用django 1.10和Linux。
注意:英语不是我的母语;请原谅我的任何错误
请注意,如果我可以从Django admin
中上传图像STATIC_URL = '/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static/imagenes/')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
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)
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'}),
}
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))
<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 %}
你可以帮我解决这个问题吗?
答案 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
命令在你每次更改静态文件时都运行所有上传的文件,你会等待更长的等待时间在该命令和重复上传。
希望这有帮助。