2014-08-28 4 views
0

Я новичок в django. Мне нужно отобразить некоторые поля и формы на основе определенных условий. У меня есть forms.py, какПроблема при отображении поля в формах django

class ArgsForm(forms.Form): 
    run_options = forms.MultipleChoiceField(label='Default Options', choices=(('dataQA','DataQA'),('merge','Merge')), required=False, 
    widget=forms.CheckboxSelectMultiple(attrs={'checked' : 'checked'})) 


class CharOptionForm(forms.Form): 
    name = forms.CharField(label='Name', required=False) 
    char_choices=(('1','CC Char',), ('0','IC Char',)) 
    options = forms.ChoiceField(required=True, label='Run Type', widget=forms.RadioSelect, choices=char_choices, initial='1') 


    def clean(self,request): 
      data = self.cleaned_data 
      if data.get('options', 1): 
       raise forms.ValidationError('Match found') 
      else: 
       raise forms.ValidationError('Provide more data') 

My view.py is 
class TechnologyView(View): 
    app = AutoCharEvalApp 

    def get(self, request, *args, **kwargs): 
     form = CharOptionForm() 
     return render(request, 'autochar/charoption.html', {'form': form, 'view': self}) 

    def post(self, request, *args, **kwargs): 
     form = CharOptionForm(request.POST) 
     return HttpResponseRedirect(reverse('autochar:main', args=(form,))) 

В шаблонах я добавил

{% if messages %} 
    <ul class="messages"> 
    {% for message in messages %} 
     <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
    {% endfor %} 
    </ul> 
{% endif %} 

В основном я хочу ArgsForm должен отображаться только тогда, когда options- = 1 выбран Может кто-то пожалуйста, помогите, что происходит не так?

ответ

0

Здесь имеется довольно много ошибок.

Во-первых, clean вызывается только в том случае, если вы звоните form.is_valid(), которого вы еще не сделали. Вам нужно сделать это в методе post вида.

Во-вторых, ничего не произойдет, когда вы это сделаете, потому что вы не передали данные POST в форму. Вам необходимо создать экземпляр метода post с помощью form = CharOptionForm(request.POST).

В-третьих, если вы это сделаете, вы получите TypeError, потому что вы указали clean, чтобы принять второй параметр, request, который форма не ожидает перехода к этому методу. Вы не можете получить доступ к запросу там: вместо того, чтобы пытаться установить сообщения внутри формы, вы должны использовать ValidationErrors, которые затем отображаются в шаблоне в атрибуте errors формы.

В-четвертых, вы не можете создать экземпляр другой формы и вернуть ответ внутри метода формы clean: вам нужно сделать это в представлении.

+0

Спасибо за ответ Daniel. Я попробую ваши предложения. Я мог бы снова побеспокоить вас, если это не сработает. Еще раз спасибо – user3364086

+0

Привет, Дэниэл, я попробовал ваши предложенные изменения, но это не сработало. Я изменил свой пост. Поскольку я новичок, я не уверен, правильно ли я делаю это. Можете ли вы просмотреть или уточнить код для меня. Спасибо – user3364086

+0

Вы по-прежнему не вызываете 'form.is_valid()' в методе 'post'. И шаблон должен ссылаться на 'form.errors'. –

Смежные вопросы