[eluser]jppi_Stu[/eluser]
I'm not exactly an M-V-C guru, but at the conceptual level, if you look at the model as being just a data model, it's not the place for anything related to the user experience, including interactive views (forms) and non-interactive views (reports/pages). The view handles the actual user interface, but only based on what the controller has instructed. The controller is in control; it requests things from the model or sends things to the model for storage, handles whatever processing is needed, and provides instruction to the view for what to display to the user.
Just as I would not use a stored procedure in SQL to handle a data entry form in a stand-alone application, I would not put form processing in a CI Model. The model would not be involved until the controller had taken care of everything other than storing the data. Only then would the controller pass the data off to the model to be stored.
Of course CI is flexible in that there are multiple ways of doing things, but you were asking for best practices, and I think treating the model as just an interface to the back-end data is the conceptually correct approach. Form validation is processing user input, before we can even know if the data is worth storing, so it's none of the model's business, so to speak.
I think this abstraction serves code reuse. If you make the model do form validation, you're tying a method of the model object to that form (or set of equal forms). If you add a different form, you have to create a new method to handle it. This means you're changing the model to match changes in the UI, which is a bad road to be on -- it can lead to more duplication, regression, etc. If it's abstracted to just handle data, you can design the object interface to be reusable by many different forms, pages, etc. without ongoing changes to the model. Once properly defined, the model should only be changed if the back-end data is changed.
That's my take on it, FWIW...