2017-04-02 8 views
0

チームに所属するユーザのリストを編集するコードを記述します。このため、私は以下のように、フォームを作成:上記コンテキストに依存してDjangoフィールドを検証する

class Organization(models.Model): 
    name = models.CharField(blank=False, verbose_name=_("Name"), help_text=_('Organization Name'), max_length=256) 

class Team(models.Model): 
    organization = models.ForeignKey('Organization') 
    name = models.CharField(blank=False, verbose_name=_("Name"), help_text=_('Team Name'), max_length=256) 
    users = models.ManyToManyField('User', related_name='teams') 

    def __str__(self): 
     return self.name 

class TeamUsersForm(forms.ModelForm): 
    class Meta: 
     model = Team 
     fields = ['users'] 

    users = forms.ModelMultipleChoiceField(queryset=User.objects.filter(request.user.organization), required=False) 

    def clean_users(self): 
     users = self.cleaned_data['users'] 
     if users.exclude(organization=request.user.organization): 
      raise ValidationError(_("Cannot add user from another organization")) 
     return users 

コードは、現在の組織を決定し、同じ組織からのユーザーに表示し、モデルストアを制限するrequest値になるはずです。

しかし、requestという値はクラスの読み込み時には分かっていないため、上記のコードは機能しません。

あなたは何をお勧めしますか?

私は2つのバリエーションを考え:

  1. は、上記のクラスのようなクラスTeamUsersForm

  2. は完全にこのためのDjangoのフォームを使用して却下し、より低レベルのAPIを使用します(関数に)ローカルを作成そこTeamUsersForm__init__とアクセスrequestオーバライド

+0

以下の答えはあなたのために働いていましたか? –

+0

@nik_mはい、それは動作します – porton

答えて

1

class TeamUsersForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('request') 
     super().__init__(*args, **kwargs) 
     self.fields['users'] = forms.ModelMultipleChoiceField(queryset=User.objects.filter(self.request.user.organization), required=False) 

これはあなたのフォームをインスタンス化するとき、あなたはそれなければならないことを意味し、このよう:

# somewhere in your views.py, probably 

f = TeamUsersForm(request.POST, request=request) 
+0

私はこれを考えましたが、 'TeamUsersForm'の' users'フィールドは '__init __()'の外で初期化されています。だから私はあなたのコードが動作するかどうかは疑問です – porton

+0

ああ、ごめんなさいあなたのコードを慎重に読んでいない。今分かります – porton

関連する問題