假设我有三个模型,一个是Professor 模型,一个是Course 模型,一个是Review 模型。允许用户进行评论,评论教授特定类(class)的教授。
我在考虑如何对Professor 和Course 的多对多关系建模,以及如何在Review 中引用该关系.到目前为止,我的想法是使用 models.ManyToMany 链接 Professor 和 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
Models.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
表单.py
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 显示了Course 下的所有对象,我不确定如何显示教授的类(class)。从下拉列表中选择教授后,是否可以过滤表格,以显示他/她教授的类(class)?
请您参考如下方法:
听起来您的做法是正确的。你还没有提到你的 urls.py 结构,或者 views.py 但最直接的方法是按教授显示类(class),使用教授的 id (或 slug-field)作为参数 - 在 URL 中(v 直截了当)或作为上一页表单的输出(并使用教授参数重新加载模板)或在 Ajax 中,具体取决于您对 shiny 的偏好-新事物。
在您看来,当您调用表单时,您可以按照 this answer 中的行进行操作-
form.courses.queryset = Course.objects.filter(professor__in=[professor.id,])
请注意,我已将过滤条件放在此处的列表中,该列表只有一项 - 它确实为您提供了扩展范围,或稍后使用查询集实现更复杂的功能。
如果您使用基于类的 View ,请适当调整。 :)
