首页 > 解决方案 > 使用 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)

标签: django

解决方案


目前你的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")

推荐阅读