单击提交按钮时,Django中的csv文件上载不保存在数据库中

时间:2016-01-04 14:23:44

标签: html django django-forms

我想上传csv文件并将内容保存在数据库中。但是当我点击提交按钮时,没有任何事情发生。以下是我的代码。我使用Django 1.9和python 3.4与postgres。 utils.py

from .models import Account
import csv
import codecs
from io import StringIO
from io import TextIOWrapper
def handle_uploaded_file(file, valid_fields_method, record_creation_function):

    file.seek(0)

    data = csv.DictReader(codecs.iterdecode(file, 'utf-8'))
    if not valid_fields_method(data.fieldnames):
        return False, -1

    result, rows_error = record_creation_function(data)

    return result, rows_error


def account_valid_fields(field_names):
    required_fields = ('species', 'x', 'y')
    for field in required_fields:
        if field not in field_names:
            return False
    return False

def create_account_in_db(dict_data):
    list_data = []
    result = False
    rows_error = 0
    for record in dict_data:
        species = record['species']
        x = record['x']
        y = record['y']
        account = models.Account(species=species,\
                                 x=x,\
                                 y=y)
        list_data.append(account)
    if list_data:

                   # bulk_create will create multiple object in a single query
        created_accounts = models.Account.objects.bulk_create(list_data)
        if len(list_data) == len(created_accounts):
            result=True
        else:
            rows_error = len(list_data) - len(created_accounts)
    return result, rows_error

models.py

class Account(models.Model):
    species=models.CharField(max_length=255)
    x=models.IntegerField()
    y=models.IntegerField()

    last_modified = models.DateTimeField(auto_now = True)
    first_created = models.DateTimeField(auto_now_add = True)

    def __str__(self):
        return "%s %s %s" % (self.species, self.x,self.y)

views.py

def add_multiple_accounts(request):
    if request.method == 'POST':
        csv_upload_form = UploadFileForm(request.POST, request.FILES)
        if csv_upload_form.is_valid():
             file = csv_upload_form.cleaned_data['file']
             csv_result, rows_error = utils.handle_uploaded_file(file, utils.account_valid_fields, utils.create_account_in_db)
             if csv_result:
                 message = 'Successfully imported accounts from the csv file to the database.\n'
                 message += 'The system is creating Active Directory Accounts using those information in the background.\n'
                 message += 'Please wait...'
                 messages.add_message(request, messages.INFO, message)
             else:
                 message = 'There are some errors occured. Please try again.'
                 messages.add_message(request, messages.INFO, message)
        else:
                 csv_upload_form = UploadFileForm()
    return render_to_response('add_multiple.html', locals(), context_instance=RequestContext(request))

urls.py

url(r'^csv',add_multiple_accounts),

add_multiple.html

<form method="post" enctype="multipart/form-data">
   {% csrf_token %}
   {{ csv_upload_form.as_p }}
   <button type="submit" class="action green btn-center" name="action" value="add_csv"><span class="label">Upload</span></button>
   <input type="submit" />
</form>

0 个答案:

没有答案