如何从 .views 中的外键中删除特定项目?姜戈

how to delete an specific item from a foreign key within .views? Django

我正在开发一个 Django 应用程序,您只能在活动所有者的批准下加入活动。

至此,我已经有了将当前用户添加到事件中进行审批的功能。

.观看次数

@login_required
def request_event(request, pk):
    previous = request.META.get('HTTP_REFERER')
    try:
        post = Post.objects.get(pk=pk)
        Attending.objects.create(post=post, attendant=request.user)
        messages.success(request, f'Request sent!')
        return redirect(previous)
    except post.DoesNotExist:
        return redirect('/')

这里是删除用户请求的函数(现在是删除当前登录用户的请求)

@login_required
def remove_attendant(request, pk):
    previous = request.META.get('HTTP_REFERER')
    try:
        post = Post.objects.get(pk=pk)
        #attendant = #post.attending_set.all
        Attending.objects.filter(post=post, attendant=request.user).delete()
        messages.success(request, f'User removed!')
        return redirect(previous)
    except post.DoesNotExist:
        return redirect('/')

我的情况是,我在获取活动的服务员(所有添加为服务员的用户)方面遇到了问题,因此所有者可以拒绝他想要的任何请求。

如何更改此设置以便该函数将删除事件的特定用户?

谢谢!!

补充:

models.py

class Attending(models.Model):
    is_approved = models.BooleanField(default=False)
    attendant = models.ForeignKey(User, related_name='events_attending', on_delete=models.CASCADE, null=True)
    post = models.ForeignKey('Post', on_delete=models.CASCADE, null=True)

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)

urls.py

path('post/<int:pk>/remove_attendant/', views.remove_attendant, name='remove-attendant'),

.html

{% for user in object.attending_set.all %}
                <div class="d-flex mb-3 border-top pt-3">
                      <div class="p-2 align-self-center">
                        <div class="mr-1 d-inline-block" style="height:40px; width:40px;">
                            <img class="rounded-circle img-st-user-pro" src="{{ user.attendant.profile.image.url }}">
                        </div>
                      </div>
                      <div class="p-2 align-self-center">
                        <h6 class="font-weight-bold mb-0">{{ user.attendant.first_name }}</h6>
                        <h6 class="mb-0 text-secondary">24 años</h6>
                      </div>
                      <div class="ml-auto p-2 align-self-center">
                        <a href="#" style="font-size: 14px !important;" class="btn-pre p-2 rounded text-decoration-none text-white pl-3 pr-3"><i class="pr-2 fa-solid fa-circle-check"></i>Approve</a>
                        <a href="   /post/{{ object.pk }}/attendants/{{ object.pk_attendant }}/remove-attendant/" style="font-size: 14px !important;" class="bg-white p-2 rounded text-decoration-none text-dark border pl-3 pr-3 ml-2">Reject</a>
                      </div>


                </div>
{% endfor %}

您需要在 URL 中输入话务员 ID。所以,像 posts/<int:pk_post>/attendants/<int:pk_attendant>/remove.

@login_required
def remove_attendant(request, pk_post, pk_attendant):
    previous = request.META.get('HTTP_REFERER')
    try:
        Attending.objects.filter(attendant_id=pk_attendant).delete()
        messages.success(request, f'User removed!')
        return redirect(previous)
    except post.DoesNotExist:
        return redirect('/')

您可能会注意到您甚至不需要 URL 中的 post id。如果你想保留它,你的选择。顺便说一句,这些东西在 Django 教程中有很长的解释。