Уведомления

Группа в Telegram: @pythonsu

#1 Май 29, 2016 06:46:28

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV to model через админку

Добрый день. Задача - импортировать текстовую таблицу (по сути тот же 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

Офлайн

#2 Май 29, 2016 08:39:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

CSV to model через админку

У вас есть форма, которая работает.
Засуньте эту форму в ModelAdmin.



Офлайн

#3 Май 29, 2016 14:44:26

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV to model через админку

FishHook
У вас есть форма, которая работает.Засуньте эту форму в ModelAdmin.
То есть это можно все делать не выдумывая велосипед? Мой основной вопрос по шаблону, как шаблон должен выглядеть? Я так понимаю, если в ModelAdmin есть свой обработчик формы, то шаблон не должен отличаться от какого-то уже имеющегося в джанго.

Отредактировано mirak (Май 29, 2016 14:45:46)

Офлайн

#4 Май 29, 2016 18:14:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

CSV to model через админку



Офлайн

#5 Май 29, 2016 21:18:01

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV to model через админку

Насколько я понимаю эта форма которая прикручивается к админке, должна сабклассить ModelForm, у меня же форма простая, от Form. Она не редактирует модель. В идеале мне и ModelAdmin не надо. Задача моей формы, вызвать Model.objects.bulk_create с данными которые перегоняются через эту форму. Но сделать это надо через админку.

Отредактировано mirak (Май 29, 2016 21:18:37)

Офлайн

#6 Май 29, 2016 21:22:09

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV to model через админку

Смотрю в сторону proxy model

Офлайн

#7 Май 30, 2016 00:34:42

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV to 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',
    )

admin.py
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)

Офлайн

#8 Май 30, 2016 04:36:47

mirak
Зарегистрирован: 2016-02-24
Сообщения: 34
Репутация: +  0  -
Профиль   Отправить e-mail  

CSV to model через админку

Победил. Перепилил шаблон и готово.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version