扩展Django管理员进行数据导入 [英] Extending Django Admin for data import

查看:223
本文介绍了扩展Django管理员进行数据导入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我已经在Stackoverflow中找到了以下问题,但是,我想在django管理界面中为特定的模型构建导入功能/表单。因为我是django的新手,我一直都没有把它连接起来。 将数据导入Django Admin 中的数据库



我想我知道如何使用Django对象以及如何使用CSV阅读器模块,但是我有一段时间把它放在Django中。



我以前尝试过的是:



models.py



  class RfidTag(models.Model):

可从导入文件中获取RFID标签


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


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


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



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

class Meta:
mo del = 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')
记录中的行:
self.system = line [0]
self.tagId = line [1]
self.serial =行[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))

返回my_urls + urls

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

import_tags.short_description =导入新的RFID标签
pass

admin.site.register(RfidTag,RfidTagAdmin)



views.py



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



我的问题是,管理员行动实际上是正确的吗?有没有更好的方法来实现我正在尝试的东西?我该怎么连线?我尚未看到表单,在我选择导入操作后点击go。

解决方案

管理员是正确的方式,但是我不会为此使用一个操作,那些被设计为在一个对象列表上运行,并且你不需要这样的操作。对于这种情况,只需扩展admin / index.html模板,并向您的视图添加一个href。之后,您创建一个您正在处理的正常表单


I'm trying to build an import feature/form in the django admin interface for a specific model.

I have already found the following question on Stackoverflow, however as I am new to django, I have not been able to wire it all up. Import csv data into database in Django Admin

I guess I understand how to work with Django objects and how to use the CSV reader module, but I have a heck of a time putting it all together in Django.

what i tried so far is this:

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("../")

My question is, is admin action actually the right way? Is there a better way to achieve what I am trying? And how do I wire this up? I have yet to see the form, after I select the import action and click "go".

解决方案

The admin is the right way, however i wouldn't be using an action for this, those are designed to function over a list of objects and you don't need that. For this case simply extend the admin/index.html template and add an href to your view. After that you create a normal form in which you do your processing

这篇关于扩展Django管理员进行数据导入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆