使用其他模型填充Django中的选择字段

时间:2017-07-12 21:04:07

标签: python django django-models django-forms

我希望在每次在另一个模型中创建新实例时添加选项的表单中创建一个选择字段。以下是相关代码:

models.py

class Instructor(models.Model):
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)

class Schedules(models.Model):
    instructor = models.CharField(max_length=128)

forms.py

class ScheduleForm(forms.ModelForm):
    instructor = forms.ChoiceField(widget=forms.Select(attrs={'class': 'form-control'}))

我想要它,以便日程表单的讲师选择字段中的每个选项始终是first_name +' ' + last_name并在每次创建新的Instructor实例时添加更多选项。我听说使用ModelChoiceField是一个好主意,但我只想要部分实例,而不是所有实例。我是否需要使用population或sqlite3操作?感谢。

2 个答案:

答案 0 :(得分:0)

您可以使用普通django形式的ModelChoiceField来实现它。由于您要自定义选项字符串,因此需要继承ModelChoiceField。

from django import forms
from django.forms import ModelChoiceField
from yourapp.models import Instructor


class InstructorChoiceField(ModelChoiceField):
    """Retun first_name + last_name as option string """

    def label_from_instance(self, obj):
        return "{0} {1}".format(obj.first_name,obj.last_name)


class ScheduleForm(forms.Form):
    instructor = InstructorChoiceField(queryset = Instructor.objects.all())

答案 1 :(得分:0)

如果我是对的,您希望从讲师模型中填充ScheduleForm上的讲师字段。 你可以做的是将一个ForeignKey添加到你的Schedules模型对Instructor模型的引用,然后你可以使用Schedules Model填充你的表单。

<强> models.py

class Instructor(models.Model):
    first_name = models.CharField(max_length=128)
    last_name = models.CharField(max_length=128)

    def __str__(self):
        return "%s %s" %(self.first_name, self.last_name)

class Schedules(models.Model):
    instructor = models.ForeignKey(Instructor)

现在你可以create your form using model

<强> form.py

from django.forms import ModelForm
from myapp.models import Schedules

#Create the form class.
class ScheduleForm(ModelForm):
    class Meta:
        model = Schedules