扩展Django Admin以进行数据导入

时间:2011-09-28 12:27:01

标签: django django-models django-admin

我正在尝试在django管理界面中为特定模型构建导入功能/表单。

我已经在Stackoverflow上找到了以下问题,但是由于我是django的新手,我无法将其全部连接起来。 Import csv data into database in Django Admin

我想我理解如何使用Django对象以及如何使用CSV阅读器模块,但我有点时间将它们放在Django中。

到目前为止我尝试过的是:

models.py

class RfidTag(models.Model):
"""
Available RFID-Tags from Importfile
"""

system = models.DecimalField(
    _('system'),
    max_digits=4,
    decimal_places=0,
)

tagId = models.DecimalField(
    _('tag ID'),
    max_digits=4,
    decimal_places=0,
)

serial = models.CharField(
    _('serial'),
    max_length=10,
)


# forms.py #
class RfidImport(forms.ModelForm):
file_to_import = forms.FileField()

class Meta:
    model = RfidTag
    fields = ("file_to_import",)

def save(self, commit=False, *args, **kwargs):
    form_input = RfidImport()
    file_csv = self.cleaned_data['file_to_import']
    csv.register_dialect('excel-new', delimiter=';', quoting=csv.QUOTE_NONE)
    records = csv.reader(file_csv, dialect='excel-new')
    for line in records:
        self.system = line[0]
        self.tagId = line[1]
        self.serial = line[2]
        form_input.save()
    datafile.close()

admin.py

class RfidTagAdmin(admin.ModelAdmin):
    list_display = ('system','tagId','serial')
    actions = ['import_tags']

    def get_urls(self):
        urls = super(RfidTagAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^import/$', self.admin_site.admin_view(import_tags))
        )
        return my_urls + urls

    def import_tags(self, request, queryset):
        return HttpResponseRedirect("./import")

    import_tags.short_description = "Import new RFID tags"
    pass

admin.site.register(RfidTag, RfidTagAdmin)

views.py

@staff_member_required
def import_tags(request):
    if request.method == "POST":
        form = RfidImport(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            success = True
            context = {"form": form, "success": success}
            return HttpResponseRedirect("../")
    else:
        form = RfidImport()
        context = {"form": form}
        return HttpResponseRedirect("../")

我的问题是,管理员行动实际上是正确的方式吗?有没有更好的方法来实现我的目标?我如何连接它?在选择导入操作并单击“go”后,我还没有看到该表单。

1 个答案:

答案 0 :(得分:0)

管理员是正确的方式,但我不会为此使用操作,这些操作旨在通过对象列表运行,而您不需要它。对于这种情况,只需扩展admin / index.html模板并在视图中添加href。之后,您可以创建一个正常的表单来进行处理