Uruguay international Diego Arismendi made his full debut for Town against the league leaders.
The on-loan Stoke play-maker replaced Icelander Joey Gudjonsson in the only change to the side which had won at Chesterfield.
Jordan Rhodes set a post-war club record by scoring his 35th goal of the season from the penalty spot after a 13th minute trip on Town winger Gary Roberts.
Charlton forced five corners in their attempt to hit back but Town looked dangerous on the counter before the break.
The visitors were reduced to 10 men when Darrel Russell was red carded.
For the best reports and reaction read Sports Monday, free inside your Yorkshire Post newspaper.