2013-08-28 2 views
0

Я пытаюсь передать значения из моей пользовательской формы в мои 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) 

ответ

1

Вам необходимо написать цикл для генерации требуемого количества полей. Пример:

outcome_qs = Outcome.objects.all() 
self.fields['relevantoutcome'] = forms.ModelMultipleChoiceField(queryset=outcome_qs, required=True, widget=forms.CheckboxSelectMultiple) 
for outcome in outcome_qs: 
    # Use Outcome primary key to easily match two fields in your view. 
    self.fields['outcomevalue_%s' % outcome.pk] = forms.CharField(widget=forms.TextInput(attrs={'size':'30'}) 
+0

Это дает равное количество полей результата для соответствующего результата. Однако, когда я пытаюсь сохранить значения, я получаю ошибку «resultvalue» в моих views.py. Это потому, что мое исходное значение может обрабатывать только одно значение или это из-за цикла for? – nlr25

+0

Теперь у вас есть много полей 'resultvalue_ *'. Вам нужно обращаться с ними по-другому в своем представлении. – HankMoody

+0

В качестве альтернативы существует ли более чистый способ, который связывает значение resultvalue с соответствующим итогом в пользовательской форме? – nlr25