2011-09-28 101 views
3

我想在一個特定的模型的Django管理界面中建立一個導入功能/窗體。擴展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("../") 

我的問題是,管理員行動其實是正確的方式?有沒有更好的方法來實現我所嘗試的?我怎麼把它連接起來?在我選擇導入操作並點擊「開始」後,我還沒有看到表單。

+0

我認爲管理員是正確的方式。它爲您提供內置身份驗證和直接集成。 – dm03514

回答

0

管理員是正確的方式,但我不會使用此操作,這些被設計爲功能對象列表,你不需要。對於這種情況,只需擴展admin/index.html模板並將href添加到您的視圖。之後,你創建一個你正在處理的正常表單

+0

好的,我設法通過鏈接導入視圖來擴展應用程序的admin change_list。視圖被調用,但它引發了TemplateSyntaxError。 也許試圖使用管理員的change_form模板而不是寫自己的模板是一個糟糕的主意,我不知道。我正在尋找一種簡單的方法來保持默認管理員的外觀和風格。 – bjoern

+0

也許如果你顯示堆棧跟蹤?在一個新的問題? – armonge

+0

我的問題已在此解決: http://stackoverflow.com/questions/7889139/django-admin-integrating-custom-forms – bjoern