Я создал простое приложение, в котором вы можете создать опрос после входа в систему и увидеть ваши опросы в поле зрения. Все работало нормально, когда у меня были Вопрос и Выбор в отдельных видах и формах, но я хотел сделать что-то, где пользователь может добавлять формы, нажав кнопку, и я хотел, чтобы формы Вопросов и Выбор были в одном представлении. Я не очень уверен, как это сделать. Я нашел некоторый учебник для динамических c форм, и я придумал это:
forms.py
class CreateChoiceForm(forms.ModelForm):
choice_0 = forms.CharField(required=True)
choice_1 = forms.CharField(required=True)
class Meta:
model = Question
fields = ['question_text']
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
choice = Choice.objects.filter(
question=self.instance
)
for i in range(len(choice) + 1):
field_name = 'choice_%s' % (i,)
self.fields[field_name] = forms.CharField(required=False)
try:
self.initial[field_name] = choice[i].choice
except IndexError:
self.initial[field_name] = ""
field_name = 'choice_%s' % (i+1,)
self.fields[field_name] = forms.CharField(required=False)
def save(self, commit=True):
question = self.instance
question.author = self.request.user
question.question_text = self.cleaned_data['question_text']
question.choice_set.all().delete
for i in range(2):
choice = self.cleaned_data['choice_text']
Choice.objects.create(question=question, choice=choice)
def get_interest_fields(self):
for field_name in self.fields:
if field_name.startswith('choice_'):
yield self[field_name]
Проблема в том, что теперь у меня появляется эта ошибка, когда я пытаясь отправить мои формы: https://i.imgur.com/uw2e8jM.png
Environment:
Request Method: POST
Request URL: http://127.0.0.1:8000/polls/createPoll/
Django Version: 2.2.5
Python Version: 3.6.10
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrap3',
'pollapp']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\views\generic\base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\contrib\auth\mixins.py" in dispatch
52. return super().dispatch(request, *args, **kwargs)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\views\generic\base.py" in dispatch
97. return handler(request, *args, **kwargs)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\views\generic\edit.py" in post
172. return super().post(request, *args, **kwargs)
File "C:\Users\MaineKomputere\Anaconda3\envs\MyDjangoEnv\lib\site-packages\django\views\generic\edit.py" in post
142. return self.form_valid(form)
File "H:\conda\INZ\pollapp\views.py" in form_valid
71. poll = form.save(commit=False)
File "H:\conda\INZ\pollapp\forms.py" in save
53. choice = self.cleaned_data['choice_text']
Exception Type: KeyError at /polls/createPoll/
Exception Value: 'choice_text'
Я бы действительно оказал некоторую помощь. Я не уверен, что делать сейчас.
Вот мой остальной код: views.py
class CreatePoll(LoginRequiredMixin, generic.CreateView):
form_class = forms.CreateChoiceForm
template_name = 'polls/createPoll.html'
success_url = reverse_lazy('pollapp:index')
def form_valid(self, form):
poll = form.save(commit=False)
poll.author = self.request.user
poll.save()
return super().form_valid(form)
def get_form(self, form_class=None):
form = super().get_form(form_class)
form.request = self.request
return form
def get_success_url(self):
return reverse('pollapp:myPolls', kwargs={'pk': self.object.pk})
models.py
class CreatePoll(LoginRequiredMixin, generic.CreateView):
form_class = forms.CreateChoiceForm
template_name = 'polls/createPoll.html'
success_url = reverse_lazy('pollapp:index')
def form_valid(self, form):
poll = form.save(commit=False)
poll.author = self.request.user
poll.save()
return super().form_valid(form)
def get_form(self, form_class=None):
form = super().get_form(form_class)
form.request = self.request
return form
def get_success_url(self):
return reverse('pollapp:myPolls', kwargs={'pk': self.object.pk})