gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:42 28 4
gpt4 key购买 nike

假设我有三个模型,一个是Professor 模型,一个是Course 模型,一个是Review 模型。允许用户进行评论,评论教授特定类(class)教授

我在考虑如何对ProfessorCourse 的多对多关系建模,以及如何在Review 中引用该关系.到目前为止,我的想法是使用 models.ManyToMany 链接 ProfessorCourse

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 ,请适当调整。 :)

关于python - 在 Django 中以不同模型的形式显示多对多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47329157/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com