Расширение Django Admin для импорта данных - PullRequest
3 голосов
/ 28 сентября 2011

Я пытаюсь создать функцию / форму импорта в интерфейсе администратора django для конкретной модели.

Я уже нашел следующий вопрос по Stackoverflow, однако, поскольку я новичок в django, у меня естьне смог соединить все это. Импорт данных CSV в базу данных в 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)

просмотров.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("../")

Мой вопрос, действительно ли действия администратора - правильный путь?Есть ли лучший способ добиться того, что я пытаюсь?И как мне это подключить?Мне еще не удалось увидеть форму, после того как я выбрал действие импорта и нажал «перейти».

1 Ответ

0 голосов
/ 01 октября 2011

Администратор - правильный путь, однако я бы не стал использовать для этого действие, оно предназначено для работы со списком объектов, и вам это не нужно.В этом случае просто расширьте шаблон admin / index.html и добавьте href к вашему представлению.После этого вы создаете нормальную форму, в которой вы делаете обработку

...