【问题标题】:Display full names in Form ChoiceField but saving ID's在表单选择字段中显示全名但保存 ID
【发布时间】:2015-06-25 14:21:36
【问题描述】:

我有模型 Person - 来自另一个数据库 我将所有person_id 复制到custom_id

models.py

class Employee(models.Model):
    custom_id = models.CharField(max_length=20, unique=True)

    @property
    def person(self):
        return Person.objects.get(person_id='%s' % self.custom_id)

    def __str__(self):
        return '%s' % self.custom_id

class Task(models.Model):
    employee = models.ManyToManyField(Employee, blank=True, null=True)
    task = models.CharField(max_length=100)
    comment = models.CharField(max_length=200)

    def __str__(self):
        return '%s' % self.task

我将我的方法 person() 添加到 Employee 中,这允许我访问另一个数据库中的其他对象模型:

所以基本上当我在 shell 中输入这个时:

Employee.objects.get(custom_id='123').person.full_name

u'Adam Dylan'

我有一个ModelForm,它使用ModelMultipleChoiceField

forms.py

class TaskCreateForm(forms.ModelForm):

    employee = forms.ModelMultipleChoiceField(queryset=Employee.objects.all())

    class Meta:
        model = Task

但是Employee.objects.all() 返回一堆custom_id。 我想要以“Employee(..).person.full_name”的形式显示,但只保存custom_id's

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    我不确定您为什么认为我对您其他问题的回答在这里不起作用。您是否尝试过以下操作?如果它不起作用,它究竟是如何失败的?

    class EmployeeMultipleChoiceField(ModelMultipleChoiceField):
        def label_from_instance(self, obj):
            return obj.person.full_name
    
    class TaskCreateForm(forms.ModelForm):
        employee = EmployeeMultipleChoiceField(queryset=Employee.objects.all())
    
        class Meta:
            model = Task
    

    【讨论】:

    • 我有确切的代码。但是我收到了这个错误MultipleObjectsReturned: get() returned more than one Person -- it returned 2!
    • 这意味着有多个Person 匹配Employee 中的custom_id。您应该清理您的数据,以便每个 Employee 只有一个 Person,或者决定使用哪个(例如第一个),并使用 filter() 而不是 get()return Person.objects.filter(person_id=self.custom_id).first()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多