django進階 擴展Django Admin以導入數據



django測試 (1)

我試圖在django管理界面中為特定的模型構建一個導入特性/窗體。

我已經在Stackoverflow上發現了以下問題,但是由於我是django的新手,我還沒有能夠把它連接起來。 在Django Admin中將csv數據導入數據庫

我想我理解如何使用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("../")

我的問題是,管理員行為其實是正確的嗎? 有沒有更好的方法來實現我所嘗試的? 我怎麼把這個連接起來? 我還沒有看到表格,我選擇導入操作後,點擊“開始”。


Answer #1

管理員是正確的方式,但是我不會使用這個動作,那些被設計為在一個對象列表上運行,你不需要這樣做。 對於這種情況,只需擴展admin / index.html模板並將href添加到您的視圖。 之後,您創建一個正常的表單,在其中進行處理





django-admin