Javascript 带有类别的Django选项字段

Javascript 带有类别的Django选项字段,javascript,python,django,django-models,django-forms,Javascript,Python,Django,Django Models,Django Forms,我的models.com字段中有以下代码: 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

我的models.com字段中有以下代码:

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.pyoriginaly来自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
现在,我想做的是有一个表选项,它将有name和choice_类型的列,我已经有了。问题是,我真的不知道如何将一个选项绑定到一个类别,并让用户在创建配置文件时,根据choice_type中的选择选择一种编程语言或框架


我假设它会涉及一些JS,但这并不像django代码那样是一个问题。

您将要制作这些实际的模型,所以您会有如下内容:

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)
从可维护性的角度来看,这不仅更好,编程语言确实会发生变化:新的语言会出现,旧的语言会消失,而且它还为查询提供了更大的灵活性

然后,只需在模型表单中为类别添加一个字段:

class UserProfileForm(forms.ModelForm):
    ...
    category = forms.ModelChoiceField(queryset=ProgrammingCategory.objects.all(), required=False)
在您的表单中,您将得到一个包含完整类别列表的select和另一个包含完整语言列表的select。然后,您只需要一些AJAX来为您进行过滤:

views.py

script.js


您将要制作这些实际模型,因此您将有如下内容:

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)
从可维护性的角度来看,这不仅更好,编程语言确实会发生变化:新的语言会出现,旧的语言会消失,而且它还为查询提供了更大的灵活性

然后,只需在模型表单中为类别添加一个字段:

class UserProfileForm(forms.ModelForm):
    ...
    category = forms.ModelChoiceField(queryset=ProgrammingCategory.objects.all(), required=False)
在您的表单中,您将得到一个包含完整类别列表的select和另一个包含完整语言列表的select。然后,您只需要一些AJAX来为您进行过滤:

views.py

script.js


你能把这个再详细一点吗?你想限制用户根据规划从某些类别中进行选择吗?@Thomas nope,情况正好相反。我希望用户能够选择他们有经验的编程语言和框架。选择类型将有以下选项:编程语言、标记/脚本语言、框架。所以,我想限制某些选择。命名为某个类别,即选择类型。您在哪里存储他们有经验的数据?@Thomas在数据库中。在myapp_选项表中,您不太清楚自己想要什么。您希望根据与plang的关联性动态筛选用户可用的选项,还是只显示按选项类型分组的列表?您能对此稍作扩展吗?你想限制用户根据规划从某些类别中进行选择吗?@Thomas nope,情况正好相反。我希望用户能够选择他们有经验的编程语言和框架。选择类型将有以下选项:编程语言、标记/脚本语言、框架。所以,我想限制某些选择。命名为某个类别,即选择类型。您在哪里存储他们有经验的数据?@Thomas在数据库中。在myapp_选项表中,您不太清楚自己想要什么。您希望根据与plang的关系动态筛选用户可用的选项,还是只显示按选项类型分组的列表?我需要15个代表点来投票支持您的答案,但如果我有,我会给它200票,如果我可以的话。谢谢!我需要15个代表点来投票支持你的答案,但如果我有,我会给它200票,如果我可以的话。谢谢!