Я пытаюсь передать значения из моей пользовательской формы в мои views.py. Тем не менее, я не могу передать значение для каждого из моих вариантов мультиселектора. При рендеринге есть только 1 charfield, но несколько вариантов в multichoiceselect. Есть идеи? Будут ли использоваться формы? Не знаю, как я это реализую, но любые предложения приветствуются. Я новичок в django, поэтому объяснения также будут полезны для меня, чтобы учиться!Передача значений пользовательских форм в представлениях
models.py
class StateOption(models.Model):
partstate = models.ForeignKey(State)
partoption = models.ForeignKey(Option)
relevantoutcome = models.ManyToManyField(Outcome, through='StateOptionOutcome')
class StateOptionOutcome(models.Model):
stateoption = models.ForeignKey(StateOption)
relevantoutcome = models.ForeignKey(Outcome)
outcomevalue = models.CharField(max_length=20)
forms.py
class UpdateStateOptionWithOutcomesForm(forms.ModelForm):
class Meta:
model = StateOption
exclude = ['partstate', 'partoption']
def __init__(self, *args, **kwargs):
super(UpdateStateOptionWithOutcomesForm, self).__init__(*args, **kwargs)
self.fields['relevantoutcome']=forms.ModelMultipleChoiceField(queryset=Outcome.objects.all(),required=True, widget=forms.CheckboxSelectMultiple)
self.fields['outcomevalue']=forms.CharField(widget=forms.TextInput(attrs={'size':'30'}) #when rendering there is only 1 charfield. There should be the same amount of charfields as there are multiplechoicefields.
views.py
stateoption = get_object_or_404(StateOption, pk=stateoption_id)
if request.method == "POST":
form = UpdateStateOptionWithOutcomesForm(request.POST, instance=stateoption)
if form.is_valid():
cd = form.cleaned_data
outcomevalue = cd['outcomevalue']
for outcome_id in request.POST.getlist('relevantoutcome'):
stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue)
template.html
{% for field in form %}
{{ field.label }}:
{{ field }}
{% if field.errors %}
{{ field.errors|striptags }}
{% endif %}
{% endfor %}
Обновление
Я могу отобразить равное количество charfields как выбор сейчас. Но мне не удается сохранить мои значения в view.py, поскольку resultvalue теперь содержит несколько значений. Любые идеи о том, как с этим справиться?
if form.is_valid():
cd = form.cleaned_data
outcomevalue = cd['outcomevalue_1'] #only handles a specific outcomevalue
for outcome_id in request.POST.getlist('relevantoutcome'):
stateoption_outcome = StateOptionOutcome.objects.create(stateoption=stateoption, relevantoutcome_id=int(outcome_id), outcomevalue=outcomevalue)
Это дает равное количество полей результата для соответствующего результата. Однако, когда я пытаюсь сохранить значения, я получаю ошибку «resultvalue» в моих views.py. Это потому, что мое исходное значение может обрабатывать только одно значение или это из-за цикла for? – nlr25
Теперь у вас есть много полей 'resultvalue_ *'. Вам нужно обращаться с ними по-другому в своем представлении. – HankMoody
В качестве альтернативы существует ли более чистый способ, который связывает значение resultvalue с соответствующим итогом в пользовательской форме? – nlr25