2016-12-04 6 views
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) 

答えて

0

https://docs.djangoproject.com/en/1.11/topics/python3/次のコードは正しく動作します。解決のためのDjangoprojectの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 
関連する問題