Попробуйте использовать следующий синтаксис (удалите Text
из расширенных свойств, поскольку он используется для импорта файлов CSV):
using (OleDbConnection connection = new
OleDbConnection(String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"HDR={1};IMEX=1;Readonly=1;Extended Properties=Excel 8.0;\"",pathOnly ,header )))
{
using (OleDbCommand command = new OleDbCommand(sql, connection))
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
dataTable = new DataTable();
adapter.Fill(dataTable);
}
}
}
Если у вас установлен поставщик Office 2007 или более поздней версии, попробуйте использовать поставщика Microsoft.ACE.OLEDB.12.0
. так как он также поддерживает чтение старых форматов Excel.
Если вы пытаетесь импортировать текстовые файлы (csv), то лучше использовать библиотеки анализа текста, такие как:
Я понятия не имею, почему печать свойства не дает Вам, хотят Вас просто присвоенный (я предполагаю, может быть, это зависит от того, где Вы печатаете, точно), но попытайтесь переопределить get_fieldsets
вместо этого. Базовое внедрение похоже на это:
def get_fieldsets(self, request, obj=None): if self.declared_fieldsets: return self.declared_fieldsets form = self.get_formset(request).form return [(None, {'fields': form.base_fields.keys()})]
Т.е. необходимо смочь просто возвратить кортежи.
РЕДАКТИРОВАНИЕ andybak. 4 года на и я нашел свой собственный вопрос снова при попытке сделать что-то подобное на другом проекте. На этот раз я пошел с этим подходом, хотя изменено немного, чтобы избежать необходимости повторять fieldsets определение:
def get_fieldsets(self, request, obj=None):
# Add 'item_type' on add forms and remove it on changeforms.
fieldsets = super(ItemAdmin, self).get_fieldsets(request, obj)
if not obj: # this is an add form
if 'item_type' not in fieldsets[0][1]['fields']:
fieldsets[0][1]['fields'] += ('item_type',)
else: # this is a change form
fieldsets[0][1]['fields'] = tuple(x for x in fieldsets[0][1]['fields'] if x!='item_type')
return fieldsets
У меня есть некоторый пример кода из недавнего моего проекта, которому я верю, может помочь Вам. В этом примере суперпользователи могут отредактировать каждое поле, в то время как всем остальным исключили поле "описания".
Обратите внимание, что я думаю, что ожидается, что Вы возвращаете a Form
класс от get_form
, который мог быть, почему Ваш не работал совершенно верно.
Вот пример:
class EventForm(forms.ModelForm):
class Meta:
model = models.Event
exclude = ['description',]
class EventAdminForm(forms.ModelForm):
class Meta:
model = models.Event
class EventAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
return EventAdminForm
else:
return EventForm
admin.site.register(models.Event, EventAdmin)
Это мое решение:
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
self.exclude = ()
else:
self.exclude = ('field_to_exclude',)
return super(MyModelAdmin, self).get_form(request, obj=None, **kwargs)
Надежда может помочь