2013-04-20 41 views
0

我有一些工作,但我相信它不是這樣做的最佳方式,因爲我有重複的代碼。 這是一個小部件,用於顯示客戶端可以屬於的組的複選框。一個客戶可以屬於多個組。過載ModelMultipleChoiceField __init__對很多很多

我確信我已經搞亂了widget的重載。

models.py

class Client(models.Model): 
    name = models.CharField(u'Name', max_length=250, unique=True) 
    groups = models.ManyToManyField('ClientGroup', related_name="client") 
    def __unicode__(self): 
     return self.name 

class ClientGroup(models.Model): 
    name = models.CharField(u'Name', max_length=250, unique=True) 
    def __unicode__(self): 
     return self.name 

forms.py

# -*- coding: utf-8 -*- 

from django import forms 
from models import ClientGroup 

class ClientGroupForm(forms.ModelForm): 
    class Meta: 
     model = ClientGroup 
     fields = ('groups',) 

    groups = forms.ModelMultipleChoiceField(queryset=ClientGroup.objects.all(), 
             widget=forms.CheckboxSelectMultiple(), 
             label='', 
             required=False) 

    def __init__(self, client_id = None, *args, **kwargs): 
     super(ClientGroupForm, self).__init__(*args, **kwargs) 
     if client_id: 
      self.fields['groups'] = forms.ModelMultipleChoiceField(queryset = ClientGroup.objects.all(), 
             initial=ClientGroup.objects.filter(client = client_id), 
             widget=forms.CheckboxSelectMultiple(), 
             label='', 
             required=False) 


    def __unicode__(self): 
     return self.groups 

views.py

def client(request, pk = 0): 
    client={} 
    if pk != 0: 
     client = Client.objects.get(pk = pk) 

    groupsForm = ClientGroupForm(pk) 
    context = {'client':client, 'groupsForm': groupsForm} 
    return render(request, 'client.html', context) 

誰能告訴我一個更好的編碼forms.py的方法?

感謝

回答

0

您可以取代

class ClientGroupForm(forms.ModelForm): 
    # stuff 

    def __init__(self, client_id = None, *args, **kwargs): 
     super(ClientGroupForm, self).__init__(*args, **kwargs) 
     if client_id: 
      self.fields['groups'] = forms.ModelMultipleChoiceField(queryset = ClientGroup.objects.all(), 
             initial=ClientGroup.objects.filter(client = client_id), 
             widget=forms.CheckboxSelectMultiple(), 
             label='', 
             required=False) 

class ClientGroupForm(forms.ModelForm): 
    # stuff 

    def __init__(self, *args, **kwargs): 
     self.client_id = kwargs.get('client_id', None) 
     super(ClientGroupForm, self).__init__(*args, **kwargs) 
     if client_id: 
      self.fields['groups'].queryset = ClientGroup.objects.filter(client=client_id)