views:

197

answers:

4

I'm somewhat new to Python, Django, and I'd like some advice on how to layout the code I'd like to write.

I have the model written that allows a file to be uploaded. In the models save method I'm checking if the file has a specific extension. If it has an XML extension I'm opening the file and grabbing some information from the file to save in the database. I have this model working. I've tested it in the built-in administration. It works.

Currently when there's an error (it's not an XML file; the file can't be opened; a specific attribute doesn't exist) I'm throwing an custom "Exception" error. What I would like to do is some how pass these "Exception" error messages to the view (whether that's a custom view or the built-in administration view) and have an error message displayed like if the forms library was being used. Is that possible?

I'm starting to think I'm going to have to write the validation checks again using the forms library. If that's the case, is it possible to still use the built-in administration template, but extend the form it uses to add these custom validations?

Anything to help my confusion would be appreciated.


UPDATE:

Here's my model so far, for those who are asking, "nzb" is the XML file field.
http://dpaste.com/hold/6101/

The admin interface will use the Form you associate with your model; your own views can also use the form.

This is exactly what I'd like to do. However, I don't know how to associate my forms with my models. When ever I've created forms in the past they've always acted as their own entity. I could never get the administration views to use them while using the ModelForm class. Can you shead any light on this?

I've read over the link you gave me and it seams to be what I've done in the past, with no luck.

Getting attributes from the file, should probably be a method.

Sorry, could you please elaborate on this? A method where?


UPDATE:

It seams I've been compleatly missing this step to link a form to the administration view. http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin

This should now allow me to do the validation in a Form. However, I'm still confused about how to actually handle the validation. S.Lott says it should be a method?

+4  A: 

The Form errors are automatically part of the administrative view.

See http://docs.djangoproject.com/en/dev/ref/forms/validation/#ref-forms-validation

You're happiest if you validate in a Form -- that's what Forms are for. The admin interface will use the Form you associate with your model; your own views can also use the form.

Getting attributes from the file, should probably be a separate method of the model class. The separate method of the model class can be used by the save() method of the model class or invoked at other times by view functions.


"I could never get the administration views to use them while using the ModelForm class."

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#form

http://docs.djangoproject.com/en/dev/ref/contrib/admin/#adding-custom-validation-to-the-admin


"I'm still confused about how to actually handle the validation. S.Lott says it should be a method?"

Validation in a form is done with a clean() method or a clean_somefield() method.

The "Adding custom validation to the admin" link (above) shows how to add the clean_name method to the "MyArticleAdminForm" form.

If you're still confused, trying actually typing the code from the Django web page and see what it does.

S.Lott
I've updated my question with more information. Can you take another look? You seam to understand exactly what I'd like to do, however I still don't quite know how to do it. Specifically, associating forms with models and having the administration pick up on validation errors of the models form.
Ty
Thank you! I wish I could give you 100 votes!
Ty
+1  A: 

I guess the best way would be to implement a special field class that extends FileField with custom validation of the uploaded file.

The validation is implemented in the field's clean method. It should check the XML file and raise ValidationErrors if it encounters errors. The admin system should then treat your custom errors like any other field errors.

The ImageField class is a good example of special validation like this — I recommend just reading through the source.

Guðmundur H
Ah, I see. So the ImageField class is just an extention of the FileField class, but with extra validation? Interesting! Though, I would have to open the XML file for validation in the Clean method for validation, and then again in the Save method for actually grabbing the data, no?
Ty
+1  A: 

You can provide a form that will be used by the admin site. You can then perform validations in the form code that will be displayed in the admin area.

See the docs on the admin site, and in particular the form attribute of ModelAdmin.

Brian Neal
A: 

"I'm throwing an custom "Exception" error " - Where exactly are you throwing the exception ? In your model or in your view ?

I am confused with your question, so I am assuming that you should be asking 'Where should I catch input errors if any ? ' to yourself.

The Model and View as I see are like pieces in a small assembly line. View/ Form validation is the first action which should be performed. If there is any issue with the input data through the forms. It should be prevented at the form level using form.is_valid() etc.

The models functionality should be to provide meta information about the entity itself apart from performing CRUD. Ideally it should not be bothered about the data it is getting for the CRUD operations.