首页 > 解决方案 > ModelForm Django中的ImageField问题,request.FILES为空

问题描述

我在 django 使用 FormView 和 forms.ImageField 时遇到问题

这是我的models.py

class Product(models.Model):
[...]
image = models.ImageField(
    'Imagen',
    upload_to='Productos',
)
price = models.IntegerField('Precio del metro cuadrado')
content = models.ForeignKey(Content, on_delete=models.CASCADE)

objects = ProductManager()
class Meta:
    verbose_name = ("Producto")
    verbose_name_plural = ("Productos")

def __str__(self):
    return self.product_name

表格.py

class ProductForm(forms.ModelForm):
[...]

form_type = forms.CharField(
    required=False,
    widget=forms.HiddenInput()
)

image = forms.ImageField()

class Meta:
    model = Product
    fields = (
        'product_name',
        'subtitle',
        'price',
        'description',
        'image',
        'form_type',
    )

def clean(self):
    cleaned_data = super(ProductForm, self).clean()
    product_name = self.cleaned_data.get('product_name')
    form_type = self.cleaned_data.get('form_type')
    products = Product.objects.all()
    for p in products:
        if p.product_name == product_name and form_type != 'Update':
            self.add_error('product_name', 'El nombre de este producto ya existe')
    return self.cleaned_data

我的观点.py

class ProductCreateView(LoginRequiredMixin, FormView):
form_class = ProductForm
template_name = 'producto/product-form.html'
success_url = reverse_lazy('product_app:product-list')
login_url = reverse_lazy('usuario_app:login')

def post(self, request, *args, **kwargs):
    form = self.form_class(request.POST, request.FILES)
    print(request.FILES)
    if form.is_valid():
        return self.form_valid(form)
    else:
        return self.form_invalid(form)


def form_valid(self, form):
    print('Entra')
    response = super(ProductCreateView, self).form_valid(form)
    response.delete_cookie('error')
    return response

这是我的带有 enctype="multipart/form-data" 的 html

<form
  action="{% if product == None %}{% url 'producto_app:product-create' %}{% else %}{% url 'producto_app:product-update' product.product_id %}{% endif %}"
  id="productForm"
  method="POST"
  enctype="multipart/form-data"
>
  <div class="modal-body">
    {% csrf_token %}
    <div class="form-group">
      <label for="product_name">
        <span class="text-danger">*</span> Nombre del producto
      </label>
      {{ form.product_name }} {% for error in form.product_name.errors %}
      <small id="product_name_errors" class="form-text text-danger pl-2">
        {{ error|escape }}
      </small>
      {% endfor %}
    </div>
    <div class="form-group">
      <label for="product_name">
        <span class="text-danger">*</span> Subtítulo
      </label>
      {{ form.subtitle }} {% for error in form.subtitle.errors %}
      <small id="subtitle_errors" class="form-text text-danger pl-2">
        {{ error|escape }}
      </small>
      {% endfor %}
    </div>
    <div class="form-group">
      <label for="price">
        <span class="text-danger">*</span> Valor m&sup2;
      </label>
      {{ form.price }} {% for error in form.price.errors %}
      <small id="price_errors" class="form-text text-danger pl-2">
        {{ error|escape }}
      </small>
      {% endfor %}
    </div>
    <div class="form-group">
      <label for="description"> Descripción </label>
      {{ form.description }}
    </div>
    {{form.image}} {% for error in form.image.errors %}
    <small id="image_errors" class="form-text text-danger pl-2">
      {{ error|escape }}
    </small>
    {% endfor %} 
    {{form.form_type}}
  </div>
  <div class="modal-footer">
    <button
      type="button"
      class="btn btn-primary"
      onclick="closeModal('#productChange', '#productForm')"
    >
      Actualizar
    </button>
    <button type="button" class="btn btn-secondary" data-dismiss="modal">
      Cerrar
    </button>
  </div>
</form>

我正在尝试上传图像,但 request.FILES 总是打印为空,我在几个论坛上阅读,但只有 enctype 的响应,我会感谢您的帮助。

标签: htmldjango

解决方案


推荐阅读