django - 使用 ModelChoiceField 将模型分配给另一个模型
问题描述
我是 Django 新手,想创建一个平台,教师可以在其中创建学生资料并将报告分配给特定学生。
因此,我制作了两个模型(Student & Report)和两个 CreateView。创建报告时,教师可以选择从选择字段中选择学生。我已经使用ModelChoiceField
. 但是,在提交报告模型时,学生姓名不会保存到该模型中。我怎样才能做到这一点?
最终,我希望为每个学生提供一份个人资料,显示他们的信息和附加到他们模型的报告。
模型.py
class Student(models.Model):
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
name = models.CharField(max_length=30, default="")
age = models.CharField(max_length=2, default="", blank=True)
class Report(models.Model):
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=30)
表格.py
class StudentForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(StudentForm, self).__init__(*args, **kwargs)
class Meta:
model = Student
fields = ['name','age',]
class ReportForm(forms.ModelForm):
student = forms.ModelChoiceField(queryset=Student.name, initial=0)
class Meta:
model = Report
fields = ['title','file','player',]
视图.py
class StudentCreate(LoginRequiredMixin, CreateView):
model = Student
template_name = 'student_create.html'
form_class = forms.StudentForm
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
class ReportCreate(LoginRequiredMixin, CreateView):
model = Report
template_name = 'report_create.html'
form_class = forms.ReportForm
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
解决方案
目前你的Report
模型是这样的:
class Report(models.Model):
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=30)
模型背后的基本概念是,它是我们希望某个实体的数据库表看起来如何的抽象/设计。所以我们在模型中添加的字段是我们数据库表中的列/属性。如果我们想存储一些数据,我们需要为它提供一些列(或者就模型而言是一个字段)。
您的模型Report
没有用于存储某些学生的字段(本质上是 a 的外键Student
,外键基本上是指向另一个表的特定条目的指针)。所以你应该把它添加到你的模型中:
class Report(models.Model):
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=30)
student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="reports")
推荐阅读
- r - 将一个数据帧中的一个观察值与另一个数据帧中的每个观察值匹配,而无需公共变量
- f# - F#在计算系列的无限和时获取堆栈溢出
- c# - 将字典内的字典传递给web api c#
- java - 我怎样才能确保提供者
在新的异步线程中返回一个新的 MyFacade? - flutter - 如何在flutter中调用地图或将地图实例化到主类中?
- reactjs - 背景图片不显示
- python - Discord.py - 返回随机表情符号?
- angular - Angular 7 Material 自动完成选项未显示
- html - 如何使用 flex 将 iframe 拉伸到全屏?
- oracle - 从 Oracle 迁移到 PostgreSQL 的 ORA2PG 工具的 Oracle 版本要求