Tengo problemas para cargar el campo de imagen en mi formulario de modelo.
vistas.py:
@user_passes_test(lambda x: x.is_superuser) def add_books(request): if request.method == 'POST': form = BooksForm(request.POST, request.FILES) if form.is_valid(): form.save() redirect('/') else: form = BooksForm() return render(request, 'library/books/addbook.html', {'form': form})modelos.py:
class Books(models.Model): picture = models.ImageField(upload_to='images/') name = models.CharField(max_length=100) publisher = models.CharField(max_length=200) author = models.CharField(max_length=100) member = models.ForeignKey(Member, related_name="books", null=True) def get_absolute_url(self): return reverse('library:detail_book', kwargs={'book_id': self.id}) def __unicode__(self): return "%s %s" % (self, self.name, self.author) def __str__(self): return "{0} {1}".format(self.name, self.author)formularios.py:
class BooksForm(ModelForm): class Meta: model = Books fields = ('picture', 'name', 'publisher', 'author') def clean_name(self): name = self.cleaned_data['name'] if Books.objects.filter(name=name).exists(): raise ValidationError("A Book with that name already exists!") return nameaddbook.html:
{% extends "library/base.html" %} {% block content %} <div align="center"> <tr> <form method="POST"> {% csrf_token %} <h2>Book:</h2> {{ form.as_p }} <input type="submit" value="submit"> </form> </tr> </div> {% endblock %}configuración.py:
MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')Una vez, trato de agregar un libro y agrego el campo de imagen y presiono el botón, el formulario me dice que el campo de imagen es obligatorio y no me deja cargar la imagen. ¡Gracias de antemano por su ayuda!
Para cargar archivos en su formulario, debe agregar el siguiente atributo al elemento del formulario:
<form method="POST" enctype="multipart/form-data">Sin esto, el archivo no se carga, por lo que la API de formulario de Django genera un error (ya que es un campo obligatorio).