2016-05-19 16 views
0

Django/Pythonには新しいので、愚かな言い訳になります。私はいくつかの選択フィールドを持つモデルフォームを持っています。送信を実行すると、フィールドに検証があります。これはすべてうまくいきます。ここで、検証をインラインに変更して、最初の選択フィールドの選択を検証し、最初の選択フィールドで選択したものに応じて2番目の選択フィールドを変更します。以下の悪い例を言い訳、あなたのアイデアモデルフォームのインラインバリデーションと選択肢の変更

例 models.pyなりますしてください:私の検証にあたりなどのHTMLポストの上にあるように、また

class fruit(forms.ModelForm): 
    class Meta: 
     model = request 
     fields = [ 'fruit', 'color' ] 

fruit_list = (
    ('apple','Apple'), 
    ('berries','Berries), 
) 

apple_color = (
    ('red', 'Red'), 
    ('green', 'Green'), 
) 

berries_color = (
    ('red','Red'), 
    ('blue', 'Blue'), 
) 

class fruit(models.Model): 
    fruit = models.Charfield(max_lenght=7, choices=fruit_list) 
    color = models.Charfield(max_lenght=5, choices=?????) ##Here Im looking for the answer on how to switches between the two options. Maybe just a normal form 
    def __unicode__(self): ##python 3 use __str__ 
     return str(self.fruit) 

フォームを下の私の見解。しかし、私はインライン検証をどのように行うのか、ではない私のポストに

views.py:

def home(request): 
    if request.method == 'POST': 
     form = fruit(request.POST, request.FILES) 
     title = "Request Form" 
     context = { 
       "title": title, 
       "form": form, 
     } 

     if form.is_valid(): 
      instance = form.save(commit=False) 
      return HttpResponseRedirect('/thanks/') 
    else: 
     form = fruit() 
     title = "Request Form" 
     context = { 
       "title": title, 
       "form": form, 
     } 
    return render(request, "home.html", context) 
+0

Pythonのクラスは大文字で始まる必要があります。 https://www.python.org/dev/peps/pep-0008/#id36 –

+0

save(commit = False)と一緒に何も保存していません。私はそれが目標かどうかわからない – dietbacon

+0

こんにちはDietbacon、申し訳ありませんが、私はinstance.save()を省略しました –

答えて

0

models.py

fruit_list = (
    ('apple','Apple'), 
    ('berries','Berries), 
) 

apple_color = (
    ('red', 'Red'), 
    ('green', 'Green'), 
) 

berries_color = (
    ('red','Red'), 
    ('blue', 'Blue'), 
) 

class Fruit(models.Model): 
    fruit = models.Charfield(max_lenght=7, choices=fruit_list) 
    color = models.Charfield(max_lenght=5) # Not a choice field 

    def __unicode__(self): 
     return str(self.fruit) 

forms.py

class FruitForm(forms.ModelForm): 
    class Meta: 
     model = Fruit 
     fields = [ 'fruit', 'color' ] 

    def clean_color(self): 
     data = self.cleaned_data 
     fruit = data['fruit'] 
     color = data['color'] 

     if fruit == 'apple' and color not in dict(apple_color).keys(): 
      raise forms.ValidationError('Invalid selection') 
     if fruit == 'berries' and color not in dict(berries_color).keys():    
      raise forms.ValidationError('Invalid selection') 
     return data 

商品を選択するとfruit_list、別のビューに1つのajax呼び出しをトリガし、選択した項目( 'りんご'または '果実類')を渡します。

import simplejson 
from django.http import HttpResponse 

def fruit_color_list(request): 
    fruit = request.GET.get('fruit') 
    if fruit == apple: 
     fruit_list = apple_color 
    else: 
     fruit_list = berries_color 

    return HttpResponse(simplejson.dumps(fruit_list)) 

この応答には、javascriptを使用してフルーツカラーリストに入力してください。残りの流れは同じです。

関連する問題