2012-01-23 2 views
1

я следующий код в моем models.py (удалены ненужные поля):Джанго параметры поле с категориями

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 (изначально из Джанго профилей, это разбор форма):

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 

Теперь, что бы я хотел сделать, это иметь таблицу выбора, которая будет иметь столбцы name и choice_type, которые у меня уже есть. Проблема в том, что я действительно не знаю, как я могу привязать опцию к категории и сделать пользователя, когда они создают свой профиль, выбрать язык программирования или фреймворк, основанный на выборе в choice_type.

Я предполагаю, что это будет связано с некоторыми JS, но это не такая уж большая проблема, как код django.

+0

вы можете расширить это мало? вы хотите ограничить пользователя выбором из определенных категорий на основе plang? – Thomas

+0

@ Томас нет, это наоборот. Я хочу, чтобы пользователь мог выбирать языки программирования и рамки, с которыми они имеют опыт. '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

Смежные вопросы