Обработка формы Django

У меня проблема с использованием форм Django, пока я изучаю Django и адаптирую код из различных онлайн-курсов и примеров. В результате код может быть "грязным" - но если я смогу заставить его работать так, как мне нужно, я смогу улучшить свой стиль кодирования позже.

Я хочу отобразить шаблон, содержащий форму. Некоторые данные, отображаемые на странице, отображаемой в шаблоне, считываются из одной таблицы/модели, polls_CC_Questions, и я хочу записать данные, введенные на странице, в связанную таблицу, polls_CC_Resp_NoFK.

Используются следующие модели:

class CC_Questions(models.Model):
    q_text = models.CharField('Question text', max_length=200)
    C1_Type = models.CharField('Choice 1 Type', max_length=2)
    Choice1_text = models.CharField('Choice 1 text', max_length=100)
    C2_Type = models.CharField('Choice 2 Type', max_length=2)
    Choice2_text = models.CharField('Choice 2 text', max_length=100)
    #
    def __str__(self):
        return self.q_text[:20]


class CC_Resp_NoFK(models.Model):
    Person_ID = models.IntegerField()
    Test_date = models.DateTimeField('date test taken')
    Q_ID = models.IntegerField()
    Response_value = models.IntegerField(default=0,
        validators=[MaxValueValidator(100), MinValueValidator(-100)])
    #
    def __str__(self):
        return self.Person_ID

Теперь я могу отобразить шаблон, содержащий правильные данные, когда я ввожу url: http://localhost:8000/polls/p2vote/4/ Это обрабатывается в urls.py

app_name = 'polls'
urlpatterns = [
…..
……
    # ex: /polls/p2vote/<q_id>
    path('p2vote/<int:q_id>/', p2_views.p2vote, name='p2vote'),
…..
<
def p2vote(request,q_id): 
    #next line has been copied from CC_quest view to GET Question data
    CC_question = get_object_or_404(CC_Questions, pk=q_id)
    #
    if request.method == 'POST':
        form = VoteForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('/polls/p2')
    else:
        formV = VoteForm()
    #context = {'form' : formV}
    return render(request, 'pollapp2/vote.html', {'var_name':CC_question,'form' : VoteForm()})
Используемая запись в файле views.py:

в файле forms.py

class VoteForm(forms.ModelForm):
    class Meta:
        model = CC_Resp_NoFK
        fields = ['Person_ID', 'Test_date', 'Q_ID','Response_value']

Запущенный шаблон использует данные из модели/таблицы polls_CC_Questions для создания меток поля ввода. Это работает нормально, поэтому моя отображаемая страница http://localhost:8000/polls/p2vote/5/ Отображает данные из таблицы CC_Questions, "занесенные в переменную varname", что такое вопросы и их варианты. Например, шаблон отображает содержимое {{ var_name.q_text }} и {{ var_name.Choice1_text }} , см. ниже

Кроме того, отображаемая страница, содержащая ModelForm, корректно отображается с метками. В шаблоне использовались :

Подведем итоги. Все вышеперечисленное "работает" в том смысле, что при вводе в браузере url : http://localhost:8000/polls/p2vote/X/ и "X" - id вопроса, отображается страница, извлекающая данные из модели: CC_questions. Также на странице есть поля ввода, созданные формой, VoteForm, которые позволяют вводить данные в таблицу/модель CC_Resp_noFK. Однако я хочу НЕ предлагать Q_ID в качестве поля ввода на странице, а заполнить его значением из переменной {{ var_name.id }}. Я не могу понять, нужно ли мне как-то модифицировать шаблон vote.html, особенно строку:

<label for="Q_ID">Question ID</label>
    {% render_field form.Q_ID rows="1" class="form-control" %}   << change this ??

или представление, где-то в районе form.save() ??

def p2vote(request,q_id): 
    #next line has been copied from CC_quest view to get Question data
    CC_question = get_object_or_404(CC_Questions, pk=q_id)
    #
    if request.method == 'POST':
        form = VoteForm(request.POST)
        if form.is_valid():
            form.save()  << Somewhere around here ??
            return redirect('/polls/p2') 
    else:
        formV = VoteForm()
        #context = {'form' : formV}
        # return render(request, 'pollapp2/vote.html', context)
        # following return tries to send question record into vote.html template
    return render(request, 'pollapp2/vote.html', {'var_name':CC_question,'form' : VoteForm()})

Шаг 1: Удалить Q_ID из VoteForm.

class VoteForm(forms.ModelForm):
    class Meta:
        model = CC_Resp_NoFK
        fields = ['Person_ID', 'Test_date', 'Response_value']

Шаг 2: Добавьте Q_ID после проверки валидности формы и перед сохранением объекта.

def p2vote(request,q_id): 
    #next line has been copied from CC_quest view to get Question data
    CC_question = get_object_or_404(CC_Questions, pk=q_id)
    if request.method == 'POST':
        form = VoteForm(request.POST)
        if form.is_valid():
            item = form.save(commit=False)
            item.Q_ID = q_id
            item.save()
            return redirect('/polls/p2') 
Вернуться на верх