Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django admin多对多递归字段小部件显示相同的对象_Python_Django Admin - Fatal编程技术网

Python Django admin多对多递归字段小部件显示相同的对象

Python Django admin多对多递归字段小部件显示相同的对象,python,django-admin,Python,Django Admin,我有一个通过Django Admin管理的后端调度应用程序。用于管理人员及其角色的成员表包括两个递归字段,用于指示特定人员是否有雇主(ForeignKey)或是否与一个或多个客户(ManyToMany)关联 问题是,当通过Django Admin添加或编辑成员时,雇主选择列表和客户选择列表为每行显示“成员对象”,而不是所需的各种公司名称列表 Python2.7.3与Django1.7.1以及Python3.4.3与Django1.10.3中存在相同的问题 # models.py class Me

我有一个通过Django Admin管理的后端调度应用程序。用于管理人员及其角色的成员表包括两个递归字段,用于指示特定人员是否有雇主(ForeignKey)或是否与一个或多个客户(ManyToMany)关联

问题是,当通过Django Admin添加或编辑成员时,雇主选择列表和客户选择列表为每行显示“成员对象”,而不是所需的各种公司名称列表

Python2.7.3与Django1.7.1以及Python3.4.3与Django1.10.3中存在相同的问题

# models.py
class Member(models.Model):
    first_name = models.CharField(max_length = 30)
    last_name = models.CharField(max_length = 30)

    role_choices = (
        ('Attendee', 'Attendee'),
        ('Customer', 'Customer'),
        ('Registrar', 'Registrar'),
          )

    now = timezone.now()

    role = models.CharField(choices=role_choices, max_length=50)
    created_date = models.DateTimeField(default=now)
    employer = models.ForeignKey('self', null=True, blank=True,
                     limit_choices_to={'role': "Customer"})
    customers = models.ManyToManyField('self', limit_choices_to= 
        {'role': "Customer"}, related_name="registrar_customers", 
        null=True, blank=True)
    company_name = models.CharField(max_length=100, null=True, blank=True)

    def __unicode__(self):
        if self.role == "Customer":
            name = self.company_name
        elif self.role == "Attendee":
            name = "{} - {}{}".format(self.employer.company_name, 
                self.first_name, self.last_name)
        else:
            name = self.first_name + " " + self.last_name

        return name

# admin.py
class MemberAdminForm(forms.ModelForm):
    class Meta:
        model = Member

    # Form override to force company names into picklists
        customers = forms.MultipleChoiceField(required=False)

        def __init__(self, *args, **kwargs):
            super(MemberAdminForm, self).__init__(*args, **kwargs)
            cust_choices = ((obj.id, obj.company_name) for obj 
                            in Member.objects.filter(role = 'Customer'))

            self.fields['employer'].choices = cust_choices
            self.fields['customers'].choices = cust_choices

        fields = ['first_name', 'last_name', 'role', 
                    'created_date', 'employer', 'customers', 'company_name']

class MemberAdmin(admin.ModelAdmin):
    list_display = ('first_name', 'last_name', 'role', 
            'created_date', 'employer', 'company_name')

    form = MemberAdminForm

admin.site.register(Member, MemberAdmin)
根据,以下代码正常工作。感谢Django项目的Darius提供的解决方案

# models.py

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Member(models.Model):
    first_name = models.CharField(max_length = 30)
    last_name = models.CharField(max_length = 30)

    role_choices = (
        ('Attendee', 'Attendee'),
        ('Customer', 'Customer'),
        ('Registrar', 'Registrar'),
          )

    now = timezone.now()

    role = models.CharField(choices=role_choices, max_length=50)
    created_date = models.DateTimeField(default=now)
    employer = models.ForeignKey('self', null=True, blank=True,
                     limit_choices_to={'role': "Customer"})
    customers = models.ManyToManyField('self', limit_choices_to= 
        {'role': "Customer"}, related_name="registrar_customers", 
        null=True, blank=True)
    company_name = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        if self.role == "Customer":
            name = self.company_name
        elif self.role == "Attendee":
            name = "{} - {}{}".format(self.employer.company_name, 
                self.first_name, self.last_name)
        else:
            name = self.first_name + " " + self.last_name

        return name
根据,以下代码正常工作。感谢Django项目的Darius提供的解决方案

# models.py

from __future__ import unicode_literals
from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class Member(models.Model):
    first_name = models.CharField(max_length = 30)
    last_name = models.CharField(max_length = 30)

    role_choices = (
        ('Attendee', 'Attendee'),
        ('Customer', 'Customer'),
        ('Registrar', 'Registrar'),
          )

    now = timezone.now()

    role = models.CharField(choices=role_choices, max_length=50)
    created_date = models.DateTimeField(default=now)
    employer = models.ForeignKey('self', null=True, blank=True,
                     limit_choices_to={'role': "Customer"})
    customers = models.ManyToManyField('self', limit_choices_to= 
        {'role': "Customer"}, related_name="registrar_customers", 
        null=True, blank=True)
    company_name = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        if self.role == "Customer":
            name = self.company_name
        elif self.role == "Attendee":
            name = "{} - {}{}".format(self.employer.company_name, 
                self.first_name, self.last_name)
        else:
            name = self.first_name + " " + self.last_name

        return name