1

我想在保存后将具有多对多关系的字段作为初始数据加载到 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”字段中拥有该课程的用户列表。

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

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

如果你有一个想法.. :)

4

1 回答 1

1

确认您的要求。您希望能够查看包含课程的表单并选择哪些用户在他们的课程中拥有该课程?

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

您可以做的是更改模型并让 ManyToManyField 指向双向,然后使用以下命令:

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

假设您有一个 ManyToManyField in Coursescalled ,这将起作用userProfiles

要让 ManyToManyField 双向工作,请查看这张票

我还没有尝试过,但我认为它应该可以工作。

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

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

于 2012-07-16T20:44:19.357 回答