in reply to dynamically adding forms
The simplest/easiest would be to just offer a text field called "number of items" that submits to the next page which has the actual recipe submission, preferably via get.
After that you can just have a button at the bottom that looks like
<input type='submit' name='add_item' value='Add Ingredient'> and when the form is submitted check for param('add_item'), and if it's found simply redisplay the form with the elements already submitted redisplayed.
(Btw, I suggest giving all the ingredients the same "form name", that way the various cgi-processing modules will give you all of the ingredients as a list. Although I'm not sure what order the list is in.)