简体   繁体   English

如何在 django 中使用 id 或 pk 检索数据

[英]How to retrieve data using id or pk in django

I am working on a project but after trying multiple way I still couldn't find the solution, I need to get the current room on the page so that user can leave room, I am aware it has to do with making queries or using pk,id.我正在做一个项目,但在尝试多种方式后我仍然找不到解决方案,我需要在页面上获取当前房间,以便用户可以离开房间,我知道这与进行查询或使用 pk 有关,ID。 (My 1st question ever, sorry if not correct way to ask). (我的第一个问题,抱歉,如果问的方式不正确)。

**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)

** **

Since you have a parameter <int:pk> the primary key of the room is passed through the pk parameter.由于您有一个参数<int:pk>房间的主键通过pk参数传递。 This thus means that leave_room should be implemented as:因此,这意味着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')

The removal link is thus a mini form to make a POST request to the 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>

Note :Section 9 of the HTTP protocol specifies that requests like GET and HEAD should not have side-effects, so you should not change entities with such requests.HTTP协议第9节指定,像GET和HEAD请求应该有副作用,所以你不应该这样的请求改变的实体。 Normally POST, PUT, PATCH, and DELETE requests are used for this.通常 POST、PUT、PATCH 和 DELETE 请求用于此目的。 In that case you make a small <form> that will trigger a POST request, or you use some AJAX calls.在这种情况下,您可以创建一个小的<form>来触发 POST 请求,或者您使用一些 AJAX 调用。


Note : You can limit views to a view to authenticated users with the @login_required decorator [Django-doc] .注意:您可以使用@login_required装饰器 [Django-doc]将视图限制为经过身份验证的用户的视图。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM