Обработка формы 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')