Last active
September 1, 2018 17:33
-
-
Save bebosudo/564c88f36cd18ee896629d4dfae6f21f to your computer and use it in GitHub Desktop.
Example of how to iterate over an uploaded file in django (2.1) using generic base classes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# --- forms.py --- | |
class CSVImportForm(forms.Form): | |
file = forms.FileField() | |
comment = forms.CharField(max_length=50, required=False) | |
# --- utils.py --- | |
csv_sep = "," | |
person_csv = ("name", | |
"surname", | |
"birth_date", | |
"sex", | |
) | |
def _split_and_clean(row): | |
"""Split a line and remove any whitespace at the sides of each field.""" | |
return (field.strip() for field in row.split(csv_sep)) | |
def temp_file_iterator(temp_file, encoding="utf-8"): | |
return (_split_and_clean(row) for b_row in temp_file.chunks() for row in b_row.decode(encoding).split("\n")[:-1]) | |
# --- views.py --- | |
class RowIteratorCSVUpload: | |
def get_rows_from_csv(self, temp_file): | |
"""Return a generator of dicts from the lines of the input temp file.""" | |
return (dict(zip(self.__class__.csv_header, row)) for row in utils.temp_file_iterator(temp_file)) | |
class PersonCSVUploadView(TemplateView, FormView, RowIteratorCSVUpload): | |
template_name = "my_app/person_import.html" | |
model = models.Person | |
form_class = forms.CSVImportForm | |
csv_header = utils.child_csv | |
def form_valid(self, form): | |
temp_file = form.cleaned_data["file"] | |
for row_num, person_dict in enumerate(self.get_rows_from_csv(temp_file)): | |
print(row_num, person_dict) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment