получить пользователя для модели из вида / формы - PullRequest
0 голосов
/ 04 марта 2020

Я создал простое приложение, в котором вы можете создать опрос после входа в систему и увидеть ваши опросы в поле зрения. Все работало нормально, когда у меня были Вопрос и Выбор в отдельных видах и формах, но я хотел сделать что-то, где пользователь может добавлять формы, нажав кнопку, и я хотел, чтобы формы Вопросов и Выбор были в одном представлении. Я не очень уверен, как это сделать. Я нашел некоторый учебник для динамических 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})

1 Ответ

0 голосов
/ 05 марта 2020

У вас проблема в этой строке:

choice = self.cleaned_data['choice_text']

Это потому, что self.cleaned_data не имеет поля choice_text, и при создании формы вы создали только два поля choice_0 и choice_1 Так что self.cleaned_data получите только эти два значения.

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