在Django中以不同模型的形式显示多对多?

时间:2017-11-16 12:01:08

标签: python django

假设我有三个模型,Professor模型,Course模型和Review模型。允许用户制作Review,其中会审核教授某个Professor的{​​{1}}。

我正在考虑如何对CourseProfessor的多对多关系进行建模,以及如何在Course中引用该关系。到目前为止,我的想法是使用Review来关联models.ManyToManyProfessor

Models.py(教授)

Course

Models.py(评论)

class Prof(models.Model):
first_name = models.CharField(max_length = 20, unique = False)
last_name = models.CharField(max_length = 20, unique = False)

    def __str__ (self):
        return self.first_name + " " + self.last_name

class Course(models.Model):
    name = models.CharField(max_length = 20, unique = True)
    prof = models.ManyToManyField(Prof)

    def __str__ (self):
        return self.name

forms.py

class Review(models.Model):
    message = models.TextField(max_length = 4000)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(null = True)
    rating = models.IntegerField(
        default = 5, 
        validators = [MaxValueValidator(5), MinValueValidator(0)]
    )
    prof = models.ForeignKey(Prof, related_name = 'reviews')
    course = models.ForeignKey(Course, related_name = 'reviews')
    user = models.ForeignKey(User, related_name = 'reviews')

    def __str__ (self):
        return self.message   

这是我目前为止用于显示表单的代码

class ReviewForm(ModelForm):
    rating = CharField(widget=TextInput(attrs={'type': 'number','value': 5, 'min': 0, 'max': 5}))

    class Meta:
        model = Review
        fields = ['message', 'rating', 'prof', 'course', 'user']

现在,<h1>New Review</h1> <form method="POST"> {% csrf_token %} <p>{{ review_form.message }}</p> <p>{{ review_form.rating }}</p> <p>{{ review_form.prof }}</p> <!-- The prof chosen's courses should be shown here --> <button type="submit">Save</button> </form> 显示forms.py下的所有对象,我不知道如何显示教授的课程。从下拉列表中选择教授后,是否可以过滤表格,以显示他/她老师的课程?

1 个答案:

答案 0 :(得分:1)

听起来你正是以正确的方式解决这个问题。你还没有提到你的urls.py结构,或views.py,但最简单的方法是教授展示课程,带教授id(或slug-field)作为参数 - 在URL中(直接进行)或作为前一页上表单的输出(并使用教授参数重新加载模板)或在Ajax中,取决于您对闪亮的新兴趣-things。

在您看来,当您致电表格时,您可以按照this answer -

的方式进行操作

form.courses.queryset = Course.objects.filter(professor__in=[professor.id,])

请注意,我已经过滤了一个列表,这里只有一个项目 - 它确实为您提供扩展范围,或者稍后使用查询集来处理更复杂的功能。

如果您正在使用基于类的视图,请根据需要进行调整。 :)