ChoiceField исчезает после переопределения метода init класса BaseForm - PullRequest
0 голосов
/ 12 октября 2019

Мое приложение из загруженного файла CSV читает значения заголовков и передает эти заголовки в другой класс, который расширяет Form. Цель состояла в том, чтобы, наконец, заполнить этот переданный список заголовков в ChoiceField. Чтобы получить аргументы, я перебрал __init__.

Каким-то образом при переопределении __init__ мое поле выбора исчезает, без каких-либо исключений. ChoiceField появляется, когда я непосредственно использую ChoiceFields и не переопределяю метод __init__. Я пытался изменить и поработать над различными способами переопределения, чтобы получить аргументы, но не смог добиться успеха, так как в каждом случае ChoiceField пропадает. Я использую python version 3.7.1 и Django version 1.9.8. Любой совет будет принят во внимание.

1.views.py:

def simple_upload(request):

    if request.method == 'POST' and request.FILES['myfile']:
        myfile = request.FILES['myfile']
        fs = FileSystemStorage()
        fs.save(myfile.name, myfile)
        for row in myfile:
            headerlist = row.decode('utf-8').split(",")
            break
        expense_form = ExpenseForm(headerlist)
        return visualize_view(request, expense_form)

    return render(request, 'core/simple_upload.html')


def visualize_view(request, expense_form):
    return render(request,'core/visualize_view.html',{'expense_form':expense_form})

2.forms.py:

from django import forms


class ExpenseForm(forms.Form):

 def __init__(self, headerlist, *args, **kwargs):
    super(ExpenseForm,self).__init__(*args, **kwargs)
    CHOICES = []
    for i in range(len(headerlist)):
        c = (i, headerlist[i])
        CHOICES.append(c)

    columns = forms.ChoiceField(choices=CHOICES)

3.visualize.py:

{% extends 'base.html' %}

{% block content %}

{{ expense_form.as_p }}

{% endblock %}

РЕДАКТИРОВАТЬ:

4.urls.py

from django.conf.urls import url
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
from uploads.core import views

urlpatterns = [
    url(r'^$', views.loginForm, name='loginForm'),
    url(r'^uploads/', views.simple_upload, name='simple_upload'),
    url(r'^admin/', admin.site.urls),
]


urlpatterns += static(settings.MEDIA_URL, document_root=settings.AKASH_ROOT)

1 Ответ

1 голос
/ 12 октября 2019

Поле не «исчезает». Во-первых, он никогда не определялся в форме.

В этом коде columns является локальной переменной внутри метода __init__. Как только этот метод возвращается, локальные переменные уничтожаются.

Чтобы динамически создать поле, вам необходимо присвоить его словарю fields экземпляра. Итак:

self.fields['columns'] = forms.ChoiceField(choices=CHOICES)

Обратите также внимание, что ваш код не очень Pythonic и может быть значительно упрощен:

CHOICES = [(i, header) for i, header in enumerate(headerlist)]

, когда вы можете поместить это непосредственно в определение поля в теле классабез необходимости определять __init__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...