2013-03-12 50 views
1

Django表单有点问题。基本上,我有两种形式,一种是免费术语搜索,另外一种是过滤器。只有在用户没有选择任何过滤器的情况下,才需要术语的字段。 我有这样的事情(但更多的过滤器在同一个班):Django:根据另一种形式动态改变表单需求

class Term(forms.Form): 
      terms = forms.CharField(
      label='Term', 
      required=True, # but false if the filters is selected 
      error_messages={'required': 'Please enter at least one search term'}, 
      widget=TextInput(attrs={ 
      'class':'textEntry', 
      'placeholder': 'Enter search'})) 

    class Filter(forms.Form): 
      filter = forms.ModelChoiceField(
      choices = [1,2, 3], 
      label = "Filter", 
      required = False) 

我到处找,但我发现没有结果。你有什么主意吗?谢谢。

回答

1

当您实例化时,您需要将filter传递给您的术语表格,然后适当地设置terms所需的值。我稍微修改了一下名称,以便更好地区分表单类。

# forms.py 
class TermForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     filter = kwargs.pop('filter', None) 
     super(self, TermForm).__init__(*args, **kwargs) 
     if filter: 
      self.fields['terms'].error_messages = { 
       'required': 'Please enter at least one search term' 
      } 
     else: 
      self.fields['terms'].required = False 

    terms = forms.CharField(
     label='Term', 
     widget=TextInput(attrs={ 
      'class': 'textEntry', 
      'placeholder': 'Enter search'})) 

# views.py, assuming Django 1.4.x+ 
from django.shortcuts import render 
from your_app.forms import TermForm, FilterForm 

def a_view(request): 
    filter_form = FilterForm(request.POST or None) 

    if request.method == 'POST' and filter_form.is_valid(): 
     term_form = TermForm(request.POST or None, 
      filter_form.cleaned_data.get('filter') 
     if term_form.is_valid(): 
      # do something 

    return render(request, 'a-template.html', 
     {'filter_form': filter_form, 'term_form': term_form}) 

所有领域都需要自动的,除非你专门设置他们不要,这就是为什么在__init__覆盖的逻辑似乎是倒退。如果您在选择filter时需要直观指明该字段是必需的,则需要添加一些JavaScript来执行此操作。

+0

downvote?真?如果您有更好的解决方案,请发布。 – Brandon 2013-03-12 12:13:40