2015-10-01 34 views
1

在我的Django的model.py我有如下條目:在Django CharFields交互應用條件

class Method1(models.Model): 
    clustering_method_param  = models.CharField(max_length=20, 
     default='ward', blank=True, choices=(
     ('complete', 'Complete linkage'), 
     ('average','Average linkage'), 
     ('ward','Ward'),)) 

    distance_method_param  = models.CharField(max_length=20, blank=True, 
      default='euclidean', choices=(
      ('euclidean', 'Euclidean'), 
      ('manhattan','Manhattan'), 
      ('pearsond','Pearson Correlation'),)) 

後來在HTML渲染成這樣:

enter image description here

我想要什麼要做的是設置條件。即聚類方法ward只能應用距離度量euclidean。如果用戶將所有其他距離度量值傳遞給ward,則應返回錯誤消息。我如何在Django中應用?或者我應該用JavaScript代替?

下面是HTML代碼的例子:

<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
 
    <script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script> 
 
    <script src="http://gregpike.net/demos/bootstrap-file-input/bootstrap.file-input.js"></script> 
 
    <meta charset="utf-8"> 
 
    </head> 
 

 

 
<body> 
 
    <form id="id-method1Form" class="form-horizontal" method="post" > <input type='hidden' name='csrfmiddlewaretoken' value='vr5MftcSxGGUeIOwKioeUlalXJdXNgkl' /> <div id="div_id_clustering_method_param" class="form-group"> <label for="id_clustering_method_param" class="control-label col-lg-2"> 
 
       Clustering method 
 
      </label> <div class="controls col-lg-8"> <select class="select form-control" id="id_clustering_method_param" name="clustering_method_param"> 
 

 
<option value="complete">Complete linkage</option> 
 
<option value="average">Average linkage</option> 
 
<option value="ward" selected="selected">Ward</option> 
 
</select> </div> </div> <div id="div_id_distance_method_param" class="form-group"> <label for="id_distance_method_param" class="control-label col-lg-2"> 
 
       Distance measure 
 
      </label> <div class="controls col-lg-8"> <select class="select form-control" id="id_distance_method_param" name="distance_method_param"> 
 
    
 
<option value="euclidean" selected="selected">Euclidean</option> 
 
<option value="manhattan">Manhattan</option> 
 
<option value="pearsond">Pearson Correlation</option> 
 
</select> </div> </div> <div class="form-group"> <div class="aab controls col-lg-2"></div> <div class="controls col-lg-8"> <input type="submit" 
 
    name="submit" 
 
    value="Submit" 
 
    
 
     class="btn btn-primary" 
 
     id="submit-id-submit" 
 
    
 
    
 
    /> </div> </div> </form> 
 

 
    <!--- END FORM DISPLAY--> 
 
</body> 
 
<html>

回答

1

對於'用戶體驗',我認爲您需要編寫一個JavaScript來根據所選clustering_method_param更改所有距離。

但是,如果你只是想'阻止'在Django上。 你可以寫一個表單驗證,像這樣:

def clean(self): 
    cleaned_data = self.cleaned_data 
    clustering_method_param = cleaned_data.get('clustering_method_param', None) 
    distance_method_param = cleaned_data.get('distance_method_param', None) 

    if clustering_method_param == 'ward': 
     if distance_method_param != 'euclidean': 
      self.errors.update(
       { 
        'distance_method_param': [u'It should be euclidean.'] 
       } 
      ) 
    return cleaned_data 
+0

謝謝。但我看不到它的任何影響。我更新了我的Django。我使用'class Method1(models.Model):'如果我們想用JavaScript的方式,我該怎麼做? – neversaint

+0

您需要將此清潔添加到Form類中。 –

+0

本教程可以幫助您使用ajax。 https://bradmontgomery.net/blog/a-simple-django-example-with-ajax/ –

1

使用JavaScript和Ajax是你的問題一個成熟的修復。您可以在第一個下拉列表中聽取用戶選擇,然後根據通過ajax的響應顯示第二個下拉列表。

+0

你能舉個JavaScript的例子嗎?我已經上傳了HTML代碼。 – neversaint