質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1625閲覧

ユーザーのアクセス権限を付けたいです

Mario_11

総合スコア95

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/08/16 07:55

ユーザーのアクセス権限を制限させたいです

現在、簡易的な投稿サイトを作っており、投稿した本人だけしか編集できないようにしたいのですが、
こちらの回答者様がおっしゃるように、リンクに直入力されてしまうと、他のユーザーでも編集ができてしまいます。
投稿した本人だけが編集できるようにするにはどうすれば良いでしょうか。
このような場合は、updateviewをクラスにした方がいいのでしょうか?
それとも関数はそのままで、何かを加えれば制限をかけられるのでしょうか?
具体的なアドバイスをいただきたいです。よろしくお願いいたします。

python

1class OnlyYouMixin(UserPassesTestMixin): 2 """本人か、スーパーユーザーだけユーザーページアクセスを許可する""" 3 raise_exception = True 4 5 def test_func(self): 6 user = self.request.user 7 return user.user_name == self.kwargs['user_name'] or user.is_superuser 8 9 10 11class UserUpdate(OnlyYouMixin, generic.UpdateView): 12 """ユーザー情報更新ページ""" 13 model = User 14 form_class = UserUpdateForm 15 template_name = 'app/user_form.html' # デフォルトユーザーを使う場合に備え、きちんとtemplate名を書く 16 slug_field = 'user_name' 17 slug_url_kwarg = 'user_name' 18 def get_success_url(self): 19 return reverse_lazy('app:user_detail', kwargs={'user_name': self.object.user_name}) 20 21 22def update_post(request, pk): 23 post = get_object_or_404(Item, pk=pk) 24 form = PostForm(request.POST or None, files=request.FILES or None, instance=post) 25 formset = Formset(request.POST or None, request.FILES or None, instance=post) 26 is_valid = formset.is_valid() 27 28 if request.method == 'POST' and formset.is_valid(): 29 form.save() 30 formset.save() 31 return redirect('app:top') 32 33 context = { 34 'formset': formset, 35 'form': form 36 } 37 38 return render(request, 'app/item_update.html', context) 39 40class ItemDeleteView(LoginRequiredMixin, DeleteView): 41 model = Item 42 success_url = reverse_lazy('app:top') 43 44 def dispatch(self, request, *args, **kwargs): 45 obj = self.get_object() 46 if obj.post_user != self.request.user: 47 raise Http404("You are not allowed to edit this Post") 48 return super(ItemDeleteView, self).dispatch(request, *args, **kwargs) 49 50 def delete(self, request, *args, **kwargs): 51 result = super().delete(request, *args, **kwargs) 52 messages.error(self.request, '削除しました'.format(self.object)) # 追加 53 return result 54

ちなみに他の権限が必要なページ(削除ページ、マイぺージ編集)はクラスで作っているため権限の制限ができています。
編集ページだけは、自分で関数を作ったので権限の制限方法が解りません。
必要なものがあれば追記いたします。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Itemモデルが分からないので、

Python

1class Item(・・・): 2 user = models.ForeignKey(User, ・・・) 3 content = models.TextField(・・・) 4```こんなモデルを想像しました。 5そして、 6```Python 7def update_post(request, pk): 8 post = get_object_or_404(Item, pk=pk, user=request.ser) 9 form = PostForm(request.POST or None, files=request.FILES or None, instance=post) 10 formset = Formset(request.POST or None, request.FILES or None, instance=post) 11 is_valid = formset.is_valid() 12 if request.method == 'POST' and formset.is_valid(): 13 form.save() 14 formset.save() 15 return redirect('app:top') 16 context = { 17 'formset': formset, 18 'form': form 19 } 20 return render(request, 'app/item_update.html', context)

get_object_or_404(Item, pk=pk, user=request.user)にすれば、それ以外の人がアクセスしたら404ページになります。


ちなみに、UserUpdateは少し無駄が多い気がします。OnlyYouMixinは要りません。
自分の情報をアップデートするのに、自分のidをURLで指定するのはおかしい気がしますよね。なので、

Python

1# urls 2path("user_update/<int:id>/", views.UserUpdate.as_view(), name="user_update"), 3# ↓ 4path("user_update/", views.UserUpdate.as_view(), name="user_update"), 5```idを指定せず、 6```Python 7class UserUpdate(generic.UpdateView): 8 model = User 9 form_class = UserUpdateForm 10 template_name = 'app/user_form.html' # デフォルトユーザーを使う場合に備え、きちんとtemplate名を書く 11 slug_field = 'user_name' 12 slug_url_kwarg = 'user_name' 13 def get_success_url(self): 14 return reverse_lazy('app:user_detail', kwargs={'user_name': self.object.user_name}) 15 def get_object(self): 16 return self.request.user
def get_object(self): return self.request.user ```を足すと、URLにidを渡さなくても勝手に自分の情報の編集ページにしてくれます。

投稿2020/08/16 08:10

編集2020/08/16 08:12
ForestSeo

総合スコア2720

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mario_11

2020/08/16 09:07

回答していただきありがとうございます!解決しました!! 意外と少ないコードで実装できることに驚きました。 UserUpdateも改良していただきありがとうございます。すごく勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問