Django选项字段与类别 [英] Django options field with categories

查看:106
本文介绍了Django选项字段与类别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的models.py(删除不相关的字段)中有以下代码:

 类选择(models.Model) :
name = models.CharField(max_length = 300)
choice_type = models.CharField(max_length = 200)

def __unicode __(self):
return self。

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

和我的utils.py(来自django-profiles的原始文件,即解析表单):

  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' )#用户将被视图填写。
return _ProfileForm

现在,我想做的是创建一个表选择,它将具有我已经拥有的名称 choice_type 列。问题是,我真的不知道如何将一个选项绑定到一个类别,并在创建他们的个人资料时选择一个编程语言或框架,并根据

我认为它会涉及到一些JS,但这不是django代码的问题。

解决方案

你将要制作这些实际的模型,所以你可以这样做:

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

class ProgrammingLanguage 。$)
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)
pre>

而且,在您的表单中,您将最终得到一个包含完整的类别列表的选择,另一个包含完整的语言列表。那么,你需要的只是一些AJAX来为你做过滤:



views.py


$ b来自django.core的序列号$ b $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ cat_id = request.GET.get('cat_id')
如果cat_id不是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

  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 +'< /选项>');
});
$('#id_planguage')。html(output.join(''));
});
}
}
updateLanguageChoices();
$ category.change(updateLanguageChoices);
});


I have the following code in my models.py(removed irrelevant fields):

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)

and my utils.py(originaly from django-profiles, that's parsing forms):

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

Now, what I'd like to do is to have a table Choices, that will have the name and choice_type columns, which I already have. The problem is that I don't really know how can I tie an option to a category, and make a user, when they're creating their profile, pick an programming language or a framework, based on choice in choice_type.

I assume it'd involve some JS, but that's not as much of a problem as django code.

解决方案

You're going to want to make these actual models, so you'd have something like this:

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)

Not only is this better from a maintainability standpoint (programming languages do change: new ones come around, old ones die out), but it also gives you much greater flexibility in querying.

Then, you simply add a field to your ModelForm for the categories:

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

And, in your form, you'll end up with a select with a complete list of categories and another with a complete list of languages. Then, all you need is some AJAX to do the filtering for you:

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

这篇关于Django选项字段与类别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆