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