无法在Django中使用媒体根目录上载图像

2024-05-16 23:40:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图上传一个图片,但我一直在谷歌搜索,但我找不到一个解决方案。 问题是它不上载图像,并且在字段中数据库被保存为空。 谁能帮我找到解决问题的办法。 我使用django1.10和Linux。在

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

请注意,如果我可以从Django admin中上载图像

在设置.py在

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

在模型.py在

^{pr2}$

在表单.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'}),
        }

在视图.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 %}

你能帮我解决这个问题吗?在


Tags: pyselfdivformstockcolformstextinput
1条回答
网友
1楼 · 发布于 2024-05-16 23:40:30

您重写了post方法上的表单,但没有将文件绑定到新表单,文档明确指出您需要这样做:
Binding uploaded files to a form

Secondly, when you use the form, you need to bind the file data. File data is handled separately to normal form data, so when your form contains a FileField and ImageField, you will need to specify a second argument when you bind your form.

所以你的台词

form = self.form_class(request.POST)

应该变成

^{pr2}$

另外,我认为您的整个post方法是不必要的,您只是复制了CreateView的默认行为。
另一件事是,将媒体文件放在static files目录中会使您的collectstatic命令在每次更改静态文件时运行所有上载的文件,您将有更长的等待时间来执行该命令和重复上载。在

希望这有帮助。在

相关问题 更多 >