0

私が取り組んでいるアプリでプロジェクトを作成すると、プロジェクトのメンバーになるユーザーを選択できます。ただし、プロジェクトの作成者 (管理者になる) を、メンバーとして選択できるユーザーのリストに含めたくありません。

管理者またはメンバーのいずれかであり、両方ではありません。もちろん、自分を一人もメンバーに加えなくても可能ですが、可能にしたくありません。

これはどのように行うことができますか?

見る:

def project_add(request):
if request.method == "POST":
    form = ProjectForm(request.POST)
    if form.is_valid():
        form.instance.date_added = datetime.date.today()
        form.instance.date_updated = datetime.date.today()
        form.instance.added_by_user = request.user
        form.save()
        return redirect(project_list)
else:
    form = ProjectForm()

return render(request, 'projects/add.html', {"form" : form})

プロジェクト モデル:

class Project(models.Model):
...rest of the fields...
added_by_user = models.ForeignKey(User)
users = models.ManyToManyField(User, related_name='projects')

def __unicode__(self):
    return self.name

def owned_by_user(self, user):
    return self.added_by_user == user

フォーム:

class ProjectForm(ModelForm):
class Meta:
    model = Project
    exclude = ('date_added', 'date_updated', 'added_by_user')

...

より明確にするために、以下の画像を提供しました。Nisse はプロジェクトを作成しているユーザーであるため、下の "Users:" (プロジェクトのメンバー) で "Nisse" を選択できるようにしたくありません。

4

1 に答える 1

2

これを試して:

class ProjectForm(ModelForm): 
    ...
    users = forms.ModelMultipleChoiceField(queryset=User.objects.all())

    # change the queryset for the modelform `users` field to exclude `instance.added_by_user`
    def __init__(self, *args, **kwargs):
        super(ProjectForm, self).__init__(self, *args, **kwargs)
        if self.instance:
            self.fields['users'].queryset = self.fields['users'].queryset.exclude(self.instance.added_by_user)

    # custom clean method to not allow the `added_by_user`
    def clean(self):
        cleaned_data = super(ProjectForm, self).clean()
        if self.instance.added_by_user in cleaned_data.get('users'):
            raise ValidationError("OH NOES")
        return cleaned_data

これを少しマッサージする必要があるかもしれません。その未テストですが、あなたはアイデアを得る

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method

于 2013-03-05T21:56:01.900 に答える