假设我有三个模型,Professor
模型,Course
模型和Review
模型。允许用户制作Review
,其中会审核教授某个Professor
的{{1}}。
我正在考虑如何对Course
和Professor
的多对多关系进行建模,以及如何在Course
中引用该关系。到目前为止,我的想法是使用Review
来关联models.ManyToMany
和Professor
。
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
下的所有对象,我不知道如何显示教授的课程。从下拉列表中选择教授后,是否可以过滤表格,以显示他/她老师的课程?
答案 0 :(得分:1)
听起来你正是以正确的方式解决这个问题。你还没有提到你的urls.py结构,或views.py
,但最简单的方法是教授展示课程,带教授id
(或slug-field)作为参数 - 在URL中(直接进行)或作为前一页上表单的输出(并使用教授参数重新加载模板)或在Ajax中,取决于您对闪亮的新兴趣-things。
在您看来,当您致电表格时,您可以按照this answer -
的方式进行操作 form.courses.queryset = Course.objects.filter(professor__in=[professor.id,])
请注意,我已经过滤了一个列表,这里只有一个项目 - 它确实为您提供扩展范围,或者稍后使用查询集来处理更复杂的功能。
如果您正在使用基于类的视图,请根据需要进行调整。 :)