📜  来自另一个模型的 django 模型选择字段 - Python (1)

📅  最后修改于: 2023-12-03 15:26:34.583000             🧑  作者: Mango

来自另一个模型的 Django 模型选择字段

在 Django 中,模型选择字段是一种让用户选择一个模型实例作为字段值的字段类型。对于某些应用程序,可能需要从其他模型中获取选择列表。本文将介绍如何从另一个模型中选择。

创建模型

首先,我们需要创建两个简单的模型, PersonGroup,具体代码如下:

from django.db import models

class Group(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name


class Person(models.Model):
    name = models.CharField(max_length=50)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

在这两个模型中,Group 模型包含一个名称字段,并且 Person 模型具有与 Group 模型的外键关联。

创建另一个模型

现在,我们将创建一个新模型 Membership,该模型将具有两个外键关联,一个相关 Person 模型实例,另一个与 Group 模型实例相关联。具体代码如下:

class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.person.name} is in {self.group.name}'

在这个新模型中,我们创建了两个外键关联字段,一个来自 Person 模型,另一个来自 Group 模型。这个模型将允许我们跟踪一个人是属于哪个组的。

创建表单

接下来,我们将创建一个表单以显示并选择 Membership 记录。该表单将显示一个下拉列表,其中包含所有可用的 Group

from django import forms

class MembershipForm(forms.ModelForm):
    group = forms.ModelChoiceField(queryset=Group.objects.all())

    class Meta:
        model = Membership
        fields = ('group',)

在这个表单中,我们从 Group 模型中获取所有记录,并将其作为下拉列表的选项。此外,我们将 group 字段添加到 Membership 模型中,以返回对应的记录。

创建视图

现在,我们将创建一个视图以呈现表单和保存选择。具体代码如下:

from django.shortcuts import render, redirect
from .forms import MembershipForm

def add_membership(request):
    if request.method == 'POST':
        form = MembershipForm(request.POST)
        if form.is_valid():
            membership = form.save(commit=False)
            membership.person = request.user.person
            membership.save()
            return redirect('success')
    else:
        form = MembershipForm()
    return render(request, 'add_membership.html', {'form': form})

在代码中,我们接受表单并在用户提交表单时做出反应。如果表单有效,则创建新的 Membership 记录。此外,我们设置 person 字段为当前用户的 Person 对象。最后,我们重定向到成功页面。如果请求是 GET 请求,则创建空表单以显示。

结论

使用 ModelChoiceField,我们可以轻松地从另一个模型中选择记录。虽然本文提供的例子可能过于简单,但这种方法在更大型的应用中非常有用。