2012-01-23 52 views
1

我在我的models.py下面的代碼(刪除無關的字段):Django的選擇與類別字段

class Choices(models.Model): 
    name = models.CharField(max_length=300) 
    choice_type = models.CharField(max_length=200) 

    def __unicode__(self): 
     return self.name 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    planguages = models.ManyToManyField(Choices) 

和我utils.py(從淵源Django的配置文件,這是解析形式):

def get_profile_form(): 
    profile_mod = get_profile_model() 
    class _ProfileForm(forms.ModelForm): 
     planguages = forms.ModelMultipleChoiceField(queryset=Choices.objects.all(), required=False, widget=forms.CheckboxSelectMultiple) 

     class Meta: 
      model = profile_mod 
      exclude = ('user',) # User will be filled in by the view. 
    return _ProfileForm 

現在,我想要做的是有一個表選項,將有namechoice_type列,我已經有了。問題在於,我不知道如何根據choice_type中的選項將選項綁定到某個類別,並讓用戶在創建其配置文件時選擇編程語言或框架。

我認爲它會涉及一些JS,但這不像django代碼那麼多。

+0

你能在這一點展開?你想限制用戶從基於plang的某些類別中選擇? – Thomas

+0

@Thomas nope,這是相反的方式。我想讓用戶能夠選擇他們有經驗的編程語言和框架。 'choice_type'將會有這些選項:編程語言,標記/腳本語言,框架。 所以,我想限制某些選擇(即'name')到某個類別(即''choice_type')。 – Milos

+0

你在哪裏存儲他們有經驗的數據? – Thomas

回答

4

你會希望讓這些實際的模型,所以你有這樣的事情:

class ProgrammingCategory(models.Model): 
    name = models.CharField(max_length=200) 

class ProgrammingLanguage(models.Model): 
    category = models.ForeignKey(ProgrammingCategory, related_name='languages') 
    name = models.CharField(max_length=300) 

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    planguages = models.ManyToManyField(ProgrammingLanguage) 

不僅是從維護的角度來看這更好的(編程語言在變:新的來老的會消失),但它也爲您提供了更大的查詢靈活性。

然後,您只需一個字段添加到您ModelForm的類別:

class UserProfileForm(forms.ModelForm): 
    ... 
    category = forms.ModelChoiceField(queryset=ProgrammingCategory.objects.all(), required=False) 

而且,在你的表格,你會得到一個選擇結束與類別的完整列表,另外一完整語言列表。然後,所有你需要的是一些AJAX做過濾爲您提供:

views.py

from django.core import serializers 
from django.http import HttpResponse, HttpResponseBadRequest 

def ajax_get_languages_for_category(request): 
    cat_id = request.GET.get('cat_id') 
    if cat_id is not None: 
     category = get_object_or_404(ProgrammingCategory, id=cat_id) 
     data = serializers.serialize('json', category.languages.all()) 
     return HttpResponse(data, mimetype='application/json') 
    else: 
     return HttpResponseBadRequest() 

的script.js

$(document).ready(function(){ 
    var $category = $('#id_category'); 
    function updateLanguageChoices() { 
     var selected = $category.val(); 
     if (selected) { 
      $.getJSON('/path/to/ajax/view/', { cat_id: selected }, function (data, jqXHR) { 
       var output = []; 
       $.each(data, function(i, item){ 
        output.append('<option value="'+item.id+'">'+item.name+'</option>'); 
       }); 
       $('#id_planguage').html(output.join('')); 
      }); 
     } 
    } 
    updateLanguageChoices(); 
    $category.change(updateLanguageChoices); 
}); 
+0

我需要15個代表點你的答案,但如果我有,我會給它200票,如果我可以的話。非常感謝! – Milos