[英]How to retrieve data using id or pk in django
我正在做一個項目,但在嘗試多種方式后我仍然找不到解決方案,我需要在頁面上獲取當前房間,以便用戶可以離開房間,我知道這與進行查詢或使用 pk 有關,ID。 (我的第一個問題,抱歉,如果問的方式不正確)。
**Views.py:
def leave_room(request, room):
room = request.GET['room.pk']
room_details = Room.objects.get(name=room)
messages = Messages.objects.filter(room=room_details.pk)
membership = RoomMember.objects.filter(user=request.user, room=messages)
membership.delete()
return redirect("/")
urls.py:
path("leave/<int:pk>/join/", views.leave_room, name="leave_room"),
html:
<a class="btn btn-danger" href="{% url 'leave_room' pk=room.pk %}">Leave Room</a>
models.py:
class Room(models.Model):
name = models.CharField(max_length=100)
about = models.TextField(max_length=500, null=True, blank=True)
creator = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='room_creator')
members = models.ManyToManyField(User, through="RoomMember")
class RoomMember(models.Model):
approved = models.BooleanField(default=False, blank=False)
room = models.ForeignKey(Room, related_name='memberships', on_delete=models.CASCADE)
user = models.ForeignKey(User, related_name='user_groups', on_delete=models.CASCADE)
class Messages(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
text = models.CharField(max_length=10000, blank=False, null=False)
date = models.DateTimeField(default=datetime.now)
room = models.ForeignKey(Room, null=True, blank=False, on_delete=models.CASCADE)
**
由於您有一個參數<int:pk>
房間的主鍵通過pk
參數傳遞。 因此,這意味着leave_room
應實現為:
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
@require_POST
@login_required
def leave_room(request, pk):
nitems, __ = RoomMember.objects.filter(
user=request.user, room_id=pk
).delete()
if not nitems:
raise Http404
else:
return redirect('name-of-some-view')
因此,刪除鏈接是一個向視圖發出 POST 請求的迷你表單:
<form method="post" action="{% url 'leave_room' pk=room.pk %}">
{% csrf_token %}
<button type="submit" class="btn btn-danger">Leave Room</button>
</form>
注:HTTP協議的第9節指定,像GET和HEAD請求不應該有副作用,所以你不應該這樣的請求改變的實體。 通常 POST、PUT、PATCH 和 DELETE 請求用於此目的。 在這種情況下,您可以創建一個小的
<form>
來觸發 POST 請求,或者您使用一些 AJAX 調用。
注意:您可以使用
@login_required
裝飾器 [Django-doc]將視圖限制為經過身份驗證的用戶的視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.