Форум сайта python.su
Добрый день. Задача - импортировать текстовую таблицу (по сути тот же csv), каждая строка - инстанс модели. Хочу сделать форму с TextArea и FileField на выбор пользователя. Делал такую страницу не в админке, все получилось. Теперь пытаюсь модифицировать под админку. Подскажите пожалуйста минимальный шаблон для такой админки и задачи. В admin.py набросал такой код, протестировать не могу, потому как не разобрался с шаблоном и вообще нет представления как форма взаимодействует с этим Вью, так что код возможно не рабочий.
class CCAdmin(ModelAdmin): change_list_template = 'admin/cc_change_list.html' list_display = ('__str__', 'brand', 'price') class Meta: model = CC def import_cc_view(self, request): if request.method == 'POST': form = ImportCCForm(request.POST) if form.is_valid(): # What to do, what to do # go to katmandu data = None if len(form.cleaned_data["text"]) > 0: data = form.cleaned_data["text"] print(form.cleaned_data['file']) if form.cleaned_data['file'] != None: data = form.cleaned_data['file'].read() enc = chardet.detect(data) print(enc) data = data.decode(enc["encoding"]) if data: CC.save_lines(CC, data) else: form = ImportCCForm() context = { 'current_app': self.admin_site.name, 'form': form, } template = 'admin/cc_add_admin.html' return render(request, template, context) def get_urls(self): urls = super(CCAdmin, self).get_urls() new_urls = [ url(r'^import-cc/$', self.admin_site.admin_view(self.import_cc_view)), ] return new_urls + urls
Офлайн
У вас есть форма, которая работает.
Засуньте эту форму в ModelAdmin.
Офлайн
FishHookТо есть это можно все делать не выдумывая велосипед? Мой основной вопрос по шаблону, как шаблон должен выглядеть? Я так понимаю, если в ModelAdmin есть свой обработчик формы, то шаблон не должен отличаться от какого-то уже имеющегося в джанго.
У вас есть форма, которая работает.Засуньте эту форму в ModelAdmin.
Отредактировано mirak (Май 29, 2016 14:45:46)
Офлайн
Офлайн
Насколько я понимаю эта форма которая прикручивается к админке, должна сабклассить ModelForm, у меня же форма простая, от Form. Она не редактирует модель. В идеале мне и ModelAdmin не надо. Задача моей формы, вызвать Model.objects.bulk_create с данными которые перегоняются через эту форму. Но сделать это надо через админку.
Отредактировано mirak (Май 29, 2016 21:18:37)
Офлайн
Смотрю в сторону proxy model
Офлайн
Подсказали мне тут интересный вариант, как это можно сделать через FakeModel
Страницу я такую прикрутил, теперь проблема - не отображается моя форма на этой странице
forms.py
class ImportCCForm(Form): text = CharField(widget=Textarea(), required=False) file = FileField( required=False, label='Select a file', help_text='max 1 megabyte', )
class FakeModel(object): class _meta: app_label = 'shop' # This is the app that the form will exist under model_name = 'import-cc' # This is what will be used in the link url verbose_name_plural = 'Import CC' # This is the name used in the link text object_name = 'ObjectName' swapped = False abstract = False class ImportCCAdminForm(admin.ModelAdmin): """ This is a funky way to register a regular view with the Django Admin. """ def has_add_permission(*args, **kwargs): return False def has_change_permission(*args, **kwargs): return True def has_delete_permission(*args, **kwargs): return False def changelist_view(self, request): context = {'title': 'Import CC'} if request.method == 'POST': form = ImportCCForm(request.POST) if form.is_valid(): # Do your magic with the completed form data. # Let the user know that form was submitted. messages.success(request, 'Congrats, form submitted!') return HttpResponseRedirect('') else: messages.error( request, 'Please correct the error below' ) else: form = ImportCCForm() context['form'] = form context = { 'test': 'test', 'opts': FakeModel._meta, 'change': True, 'is_popup': False, 'save_as': False, 'has_delete_permission': self.has_delete_permission, 'has_add_permission': self.has_add_permission, 'has_change_permission': self.has_change_permission, 'form': form, } return render(request, 'admin/change_form.html', context) admin.site.register([FakeModel], ImportCCAdminForm)
Отредактировано mirak (Май 30, 2016 00:43:12)
Офлайн
Победил. Перепилил шаблон и готово.
Офлайн