2016-05-19 6 views
0

Im neuen Django/Python so entschuldigen Sie die Dummheit. Ich habe ein Musterformular mit ein paar Auswahlfeldern. Es gibt Validierungen in den Feldern, wenn ich eine Submit-Funktion durchführe. Das funktioniert alles gut. Jetzt möchte ich die Validierung ändern, um die Auswahl des ersten Auswahlfelds inline zu validieren und dann das zweite Auswahlfeld zu ändern, abhängig davon, was für das erste Auswahlfeld ausgewählt wurde. Bitte entschuldigen Sie die folgende schlechtes Beispiel, aber Sie werden die IdeeModell Form Inline-Validierung und die Auswahl

Beispiel models.py erhalten:

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) 

Form:

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

auch so meine Validierung ist auf der HTML-Post per meine Ansicht unten. Aber wie kann ich Inline-Validierung zu tun, nicht auf meinem Beitrag

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

Klassen in Python sollten mit einem Großbuchstaben beginnen. https://www.python.org/dev/peps/pep-0008/#id36 –

+0

du speicherst dort nichts mit save (commit = False). Ich weiß nicht, ob das das Ziel ist – dietbacon

+0

Hallo Dietbacon, sorry ich habe die instance.save() –

Antwort

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 

Sobald Sie Elemente ausauswählen, triggern Sie einen Ajax-Anruf in eine andere Ansicht und übergeben Sie ausgewählte Objekte ('Apfel' oder 'Beeren').

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)) 

Füllen Sie diese Antwort in Ihrer Fruchtfarbenliste mit Javascript. Der Rest des Flusses ist gleich.

def home(request): 
    if request.method == 'POST': 
     .... 
     .... 
     if form.is_valid(): 
      instance = form.save() 
      return HttpResponseRedirect('/thanks/') 
    else: 
     .... 
    return render(request, "home.html", context) 
Verwandte Themen