1
Django Adminで管理されるバックエンドを持つスケジューリングアプリがあります。担当者とその役割を管理するためのメンバー表には、特定の人物が雇用主(ForeignKey)を持っているか、1人以上の顧客(ManyToMany)に関連付けられているかを示す2つの再帰フィールドが含まれています。Django admin多対多の再帰フィールドウィジェットが同一のオブジェクトを表示
問題は、Django Adminを使用してメンバーを追加または編集するときに、雇用者の選択リストと顧客の選択リストが、さまざまな会社名の希望のリストの代わりに行ごとに「メンバーオブジェクト」を表示することです。
Django1.7.1でPython2.7.3、Django1.10.3でPython3.4.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)