2011-03-28 3 views
0

J'ai un formulaire qui semble ne jamais valider. Le formulaire est juste trois listes déroulantes. Lorsque le formulaire est rendu, toutes les zones ont des valeurs remplies et la première est sélectionnée, donc quoi qu'il arrive, l'utilisateur ne peut pas soumettre de mauvaises valeurs, mais form.is_valid() retourne toujours false. S'il vous plaît aider!Problème de validation de formulaire Django

La forme

CLUSTER_TYPES = (
    ('ST', 'State'), 
    ('CNT', 'County'), 
    ('FCD', 'Congressional District'), 
    ('GCC', 'Circle Clustering'), 
); 

MAP_VIEWS = (
    ('1', 'Single Map'), 
    ('2', 'Two Maps'), 
    ('4', 'Four Maps'), 
); 
class ViewDataForm (forms.Form): 
    def __init__ (self, sets = None, *args, **kwargs): 
     sets = kwargs.pop ('data_sets') 
     super (ViewDataForm, self).__init__ (*args, **kwargs) 

     processed_sets = [] 
     for ds in sets: 
      processed_sets.append ((ds.id, ds.name)) 

     self.fields['data_sets'] = forms.ChoiceField (label='Data Set', choices = processed_sets) 
     self.fields['clustering'] = forms.ChoiceField (label = 'Clustering', 
                 choices = CLUSTER_TYPES) 
     self.fields['map_view'] = forms.ChoiceField (label = 'Map View', choices = MAP_VIEWS) 

La vue

def main_view (request): 
    # We will get a list of the data sets for this user 
    sets = DataSet.objects.filter (owner = request.user) 

    # Create the GeoJSON string object to potentially populate 
    json = '' 

    # Get a default map view 
    mapView = MapView.objects.filter (state = 'Ohio', mapCount = 1) 
    mapView = mapView[0] 

    # Act based on the request type 
    if request.method == 'POST': 
     form = ViewDataForm (request.POST, request.FILES, data_sets = sets) 
      v = form.is_valid() 
     if form.is_valid(): 
      # Get the data set 
      ds = DataSet.objects.filter (id = int (form.cleaned_data['data_set'])) 
      ds = ds[0] 

      # Get the county data point classifications 
      qs_county = DataPointClassification.objects.filter (dataset = ds, 
                   division = form.cleaned_data['clustering']) 

      # Build the GeoJSON object (a feature collection) 
      json = '' 
      json += '{"type": "FeatureCollection", "features": [' 
      index = 0 
      for county in qs_county: 
       if index > 0: 
        json += ',' 
       json += '{"type": "feature", "geometry" : ' 
       json += county.boundary.geom_poly.geojson 
       json += ', "properties": {"aggData": "' + str (county.aggData) + '"}' 
       json += '}' 
       index += 1 
      json += ']}' 

      mapView = MapView.objects.filter (state = 'Ohio', mapCount = 1) 
      mapView = mv[0] 
    else: 
     form = ViewDataForm (data_sets = sets) 

    # Render the response 
    c = RequestContext (request, 
         { 
          'form': form, 
          'mapView_longitude': mapView.centerLongitude, 
          'mapView_latitude': mapView.centerLatitude, 
          'mapView_zoomLevel': mapView.zoomLevel, 
          'geojson': json, 
          'valid_was_it': v 
         }) 
    return render_to_response ('main.html', c) 

Répondre

2

Vous avez remplacé la signature de la méthode __init__ de la forme de telle sorte que le premier paramètre de position est sets. Toutefois, lorsque vous l'instanciez, vous transmettez request.POST en tant que premier argument positionnel. Ainsi, le formulaire n'obtient jamais de données et ne valide donc pas.

Ne modifiez pas la signature de __init__. En fait, vous avez tout configuré correctement, vous n'avez donc pas besoin de: supprimez simplement le sets=None de la définition de la méthode, et tout devrait fonctionner.

+0

Si j'avais été attentif, 'sets = None' n'aurait pas été là en premier lieu. Merci beaucoup. – Nik

Questions connexes