我正在开发一个简单的应用程序,使用Django应用程序将收集的数据集集存储到数据集中 . 我正在使用管理界面来处理数据集对象的CRUD管理 .

例如,当我尝试使用现有数据点重命名现有数据集时,更改视图中会出现问题,这可能远远超过1000.我收到错误消息“请提交1000个或更少的表单” . 听起来所有的数据点都会再次发布,当我想要做的只是重命名数据集时 . 发生此错误时,表单中没有附加文件 .

更多应用背景:

  • 添加/更改数据集对象时,应用程序需要能够接受可选的CSV文件上载,为每行创建数据点对象,并将这些数据点与数据集关联 . 如果没有文件,则更改视图应在更改时更新其他字段 .

当唯一的更改是数据集名称时,为什么要再次上载datapoints文件?如何更改应用程序以便不重新提交数据点文件?

导致此错误的行为:

  • 在管理员列表视图中,单击'add dataset'按钮

  • 提供数据集的名称,附加带有数据点的CSV文件,单击“保存”按钮

  • 从管理列表视图中,选择刚刚创建的数据集

  • 更改数据集的名称,单击“保存”按钮

models.py

from django.db import models

class Dataset(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

class Datapoint(models.Model):
    dataset = models.ForeignKey(Dataset)
    timestamp = models.DateTimeField()
    temperature = models.DecimalField(max_digits=20, decimal_places=10)
    humidity = models.DecimalField(max_digits=20, decimal_places=10)

    class Meta:
        ordering = ('timestamp',)
        unique_together = ('dataset','timestamp',)

admin.py

from django.contrib import admin
from django.conf.urls import patterns, url
from django.shortcuts import render_to_response, render
from django.template import RequestContext
from django.core.exceptions import ValidationError
from django.db import transaction, IntegrityError

from .forms import UploadFileForm
from .models import Dataset, Datapoint

from csv import DictReader
from datetime import datetime

class DatapointInline(admin.TabularInline):
    model = Datapoint
    readonly_fields = ('timestamp', 'temperature', 'humidity',)

class DatasetAdmin(admin.ModelAdmin):
    form = UploadFileForm

    fieldsets = [
        (None, {'fields': ['name', 'datapoints_file']}),
    ]

    inlines = [DatapointInline]

    def save_model(self, request, obj, form, change):
        if 'datapoints_file' in request.FILES:
            datapoints_file = request.FILES['datapoints_file']
            try:
                with transaction.atomic():
                    if not obj.id:
                        obj.full_clean()
                        obj.save()
                    for row in DictReader(datapoints_file, delimiter=','):
                        row['timestamp'] = datetime
                            .strptime(row['timestamp'],'%m/%d/%Y %H:%M')
                            .strftime('%Y-%m-%d %H:%M')
                        row['dataset'] = obj
                        datapoint = Datapoint(**row)
                        datapoint.full_clean()
                        datapoint.save()
            except ValidationError as e:
                raise e
            except IntegrityError as e:
                raise e
        else:
            obj.save()

admin.site.register(Dataset, DatasetAdmin)

forms.py

from django import forms

class UploadFileForm(forms.ModelForm):
    datapoints_file = forms.FileField(required=False)