2017-02-10 24 views
0

画像をアップロードしようとしましたが、Googleで検索していましたが、解決策が見つかりませんでした。 問題は、画像をアップロードせず、フィールドにデータベースが保存されていることです。 誰でも私が解決策を見つけるのを助けます問題。 私はdjango 1.10とLinuxを使用しています。djangoで画像をアップロードできませんMEDIA_ROOT

注:英語は母国語ではありません。私は、Djangoの管理者

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

あなたが見ているエラーは何ですか? – Fallen

+1

この質問は終了する危険性があります。最小限の例を提供し、おそらくエラーメッセージを含める必要があります。 – cwallenpoole

+0

@Falle問題は画像をアップロードせず、データベースに保存されていることですnull – Xavier

答えて

1

あなたのpost法上のフォームをオーバーライドしているが、新しいフォームにあなたのファイルを結合していない、ドキュメントは明らかにあなたがそうする必要があると述べている:
Binding uploaded files to a form

第二に、ときフォームを使用すると、ファイルデータをバインドする必要があります。ファイルデータは通常のフォームデータとは別に処理されるため、フォーム にFileFieldとImageFieldが含まれている場合は、フォームをバインドするときに、2番目の 引数を指定する必要があります。

だからあなたのライン

form = self.form_class(request.POST) 

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

なるべきまた、私はあなただけCreateViewのデフォルトの動作を複製している、あなたの全体のpost方法が不必要だと思います。
あなたのメディアファイルを静的ファイルディレクトリに置くと、静的ファイルを変更するたびにcollectstaticコマンドがアップロードされたすべてのファイルを実行するようになります。そのコマンドで待ち時間が長くなります。重複アップロード。

これが役に立ちます。

+0

ありがとう、私はあなたの助言のおかげでそれを解決しました。 – Xavier

+0

お寄せいただきありがとうございます。この回答があなたの問題を解決したと思われる場合は、それを承認済みとしてマークしてください。 – HassenPy

関連する問題