Django选项字段与类别 [英] Django options field with categories
问题描述
我在我的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
现在,我想做的是创建一个表选择,它将具有我已经拥有的 我认为它会涉及到一些JS,但这不是django代码的问题。 你将要制作这些实际的模型,所以你可以这样做: 不仅更好从可维护性的角度(编程语言改变:新的,旧的,死亡的),但它也给你更大的灵活性查询。 然后,你只需添加一个字段到您的 而且,在您的表单中,您将最终得到一个包含完整的类别列表的选择,另一个包含完整的语言列表。那么,你需要的只是一些AJAX来为你做过滤: views.py 名称
和 choice_type
列。问题是,我真的不知道如何将一个选项绑定到一个类别,并在创建他们的个人资料时选择一个编程语言或框架,并根据
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):
pre>
...
category = forms.ModelChoiceField(queryset = ProgrammingCategory.objects.all(),required = False)
$ 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屋!