5

Django とプログラミング初心者はこちら。デプロイしたいアプリケーションを作成しましたが、UpdateView へのアクセスをそのオブジェクトの作成者に制限する方法を理解する必要があり、困惑しています。

現在、ユーザーは CreateView .../universities/create/ を使用して大学オブジェクトを作成できますが、その後はすべてのユーザーが .../universities/update/ を使用してそのオブジェクトを編集できます。その大学の作成者であるユーザー (ManytoMany 属性「管理者」を持つユーザー) のみが大学オブジェクトの UpdateView にアクセスできるように、これを構成したいと考えています。

アドバイスをいただければ幸いです。私はこれに数日を費やしましたが、あまり牽引力がありませんでした...読んでくれてありがとう。

models.py

class University(models.Model):
    name = models.CharField(max_length=100)
    about = models.TextField()
    administrators = models.ManyToManyField(User)
    profile_picture = models.FileField(upload_to=get_upload_file_name, blank=True)

    def __unicode__(self):
        return unicode(self.name)

    def get_absolute_url(self):
        return reverse('university_detail', kwargs={'pk': str(self.id)})

ビュー.py

class UniversityCreateView(CreateView):
    model = University
    form_class = UniversityForm
    template_name = 'university_create.html'

    def form_valid(self, form):
        f = form.save(commit=False)
        f.save()
        return super(UniversityCreateView, self).form_valid(form)

class UniversityUpdateView(UpdateView):
    model = University
    form_class = UniversityForm
    template_name='university_form.html'
4

3 に答える 3

2

ビューにパーミッション デコレータを含める必要があります。詳細については、https://docs.djangoproject.com/en/dev/topics/auth/と https://docs.djangoproject.com/en/dev/topics/ をご覧ください。 auth/default/#topic-認可

したがって、更新ビューを ManytoMany 属性「administrator」を持つすべてのユーザーに限定したい場合は、次のようにする必要があります。

ビュー.py

from appname.users.decorators import requiresGroup
from django.contrib.auth.decorators import login_required



class UniversityUpdateView(UpdateView):
    model = University
    form_class = UniversityForm
    template_name='university_form.html'

    @method_decorator(requiresGroup("groupname" , login_url='/accounts/login/'))
    def dispatch(self, request, *args, **kwargs):
    return super(UniversityUpdateView, self).dispatch(request, *args, **kwargs)

また、まだ行っていない場合は、models.py の先頭に以下を含める必要があります。

from django.contrib.auth.modes import user

ユーザーモデルで管理者を定義したので、そこにあると仮定します

次に、django admin のグループ設定 ( localhost/admin/auth/group のような URL である必要があります) に移動し、特別な管理者グループ名を追加してから、管理者ユーザー セクション (localhost/admin/auth/user) に移動してから、makeそれらが管理者グループに入れられていることを確認してください

次に、@requiresGroup デコレーターの「グループ名」をユーザー グループの実際の名前に置き換えます。

@requiresGroup デコレータは標準のデコレータではないため、記述する必要があります

appname/users.decorators.py のようなフォルダー パスとファイルを作成し、decorators.py に書き込みます。

from functools import update_wrapper , wraps
from django.utils.decorators import available_attrs
from django.http import HttpResponse, HttpResponseRedirect


def requiresGroup(groupname):
    def decorator(view_function):
        def _wrapped_view(request,*args,**kwargs):
            if request.user.groups.filter(name=groupname).count()!=1:
                return HttpResponseRedirect("/")
            else:
                return view_function(request,*args,**kwargs)
        return wraps(view_function,assigned=available_attrs(view_function))(_wrapped_view)
    return decorator

これが役に立ったことを願っています

編集:間違いを犯しました。デコレータをクラスの上に置きます。それらはクラス内の関数にあるはずです。間違いにすぐに気づいたので、問題が発生していないことを願っています

于 2013-08-29T09:32:13.570 に答える