从ManytoMany字段加载MultipleChoiceField值

时间:2012-07-16 17:03:47

标签: django django-forms

我希望在保存后将MultipleChoiceField作为初始数据加载到具有多种关系的字段中。

我的课程

class Course(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField(max_length=30)
    owner = models.ForeignKey(User)

class UserProfile(models.Model):
    user = models.OneToOneField(User, unique=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='student')
    courses_list = models.ManyToManyField(Course, blank=True)

我的表单

class AddSubscibeForm(forms.ModelForm):
    userprofile_set = forms.ModelMultipleChoiceField(initial = User.objects)
    class Meta:
        model = Course

我的观点

def addstudents(request, Course_id):
    editedcourse = Course.objects.get(id=Course_id)  # (The ID is in URL)
    form = AddSubscibeForm(instance=editedcourse)
    return render(request, 'addstudents.html', locals())

实际上,我有一个有用户的多个列表,但我没有在'courses_list'字段中有该课程的用户列表..

我可以通过以下方式访问用户的cours_list:

> editedcourse = Course.objects.get(id=Course_id)
> subscribed = editedcourse.userprofile_set.all()
> subscribed.user.username

如果您有任何想法......:)

1 个答案:

答案 0 :(得分:1)

确认你在问什么。您希望能够查看带有课程的表单,并选择哪些用户在其课程中拥有该课程?

您将无法正确使用模型中不存在的ModelForm中的字段。

您可以做的是更改模型并使ManyToManyField指向两个方向,然后使用以下内容:

class AddSubscibeForm(forms.ModelForm):
    class Meta:
        model = Course
        fields = ('userProfiles')

假设您在Courses中有一个名为userProfiles的ManyToManyField,这将有效。

要让ManyToManyField双向工作,请查看this ticket

我没试过,但我认为它应该有用。

class Test1(models.Model):
    tests2 = models.ManyToManyField('Test2', blank=True)

class Test2(models.Model):
    tests1 = models.ManyToManyField(Test1, through=Test1.tests2.through, blank=True)

或者这个:

class User(models.Model):
    groups = models.ManyToManyField('Group', through='UserGroups')

class Group(models.Model):
    users = models.ManyToManyField('User', through='UserGroups')

class UserGroups(models.Model):
    user = models.ForeignKey(User)
    group = models.ForeignKey(Group)

    class Meta:
        db_table = 'app_user_groups'
        auto_created = User

以上两点都应该有效。在这两种情况下,您都不必更改数据库中的任何内容。